home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / gas_251.zip / bin_251 / opcodes / sparc-opc.c < prev    next >
C/C++ Source or Header  |  1994-07-28  |  89KB  |  1,475 lines

  1. /* Table of opcodes for the sparc.
  2.     Copyright 1989, 1991, 1992 Free Software Foundation, Inc.
  3.  
  4. This file is part of the BFD library.
  5.  
  6. BFD is free software; you can redistribute it and/or modify it under
  7. the terms of the GNU General Public License as published by the Free
  8. Software Foundation; either version 2, or (at your option) any later
  9. version.
  10.  
  11. BFD is distributed in the hope that it will be useful, but WITHOUT ANY
  12. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  14. for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this software; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.    */
  19.  
  20. /* FIXME-someday: perhaps the ,a's and such should be embedded in the
  21.    instruction's name rather than the args.  This would make gas faster, pinsn
  22.    slower, but would mess up some macros a bit.  xoxorich. */
  23.  
  24. /* v9 FIXME: Doesn't accept `iprefetch', `setX', `signx', `cleartop', `cas',
  25.    `casx', `clrx', `clruw' synthetic instructions for v9.  */
  26.  
  27. #include <stdio.h>
  28. #include "ansidecl.h"
  29. #include "opcode/sparc.h"
  30.  
  31. const char *architecture_pname[] = {
  32.     "v6",
  33.     "v7",
  34.     "v8",
  35.     "sparclite",
  36.     "v9",
  37.     NULL,
  38. };
  39.  
  40. /* v9: This file is correct for SPARC Version 9 Draft 1.2.4.  */
  41.  
  42. /* Branch condition field.  */
  43. #define COND(x)        (((x)&0xf)<<25)
  44.  
  45. /* v9: Move (MOVcc and FMOVcc) condition field.  */
  46. #define MCOND(x,i_or_f)    ((((i_or_f)&1)<<18)|(((x)>>11)&(0xf<<14))) /* v9 */
  47.  
  48. /* v9: Move register (MOVRcc and FMOVRcc) condition field.  */
  49. #define RCOND(x)    (((x)&0x7)<<10)    /* v9 */
  50.  
  51. #define CONDA    (COND(0x8))
  52. #define CONDCC    (COND(0xd))
  53. #define CONDCS    (COND(0x5))
  54. #define CONDE    (COND(0x1))
  55. #define CONDG    (COND(0xa))
  56. #define CONDGE    (COND(0xb))
  57. #define CONDGU    (COND(0xc))
  58. #define CONDL    (COND(0x3))
  59. #define CONDLE    (COND(0x2))
  60. #define CONDLEU    (COND(0x4))
  61. #define CONDN    (COND(0x0))
  62. #define CONDNE    (COND(0x9))
  63. #define CONDNEG    (COND(0x6))
  64. #define CONDPOS    (COND(0xe))
  65. #define CONDVC    (COND(0xf))
  66. #define CONDVS    (COND(0x7))
  67.  
  68. #define CONDNZ    CONDNE
  69. #define CONDZ    CONDE
  70. #define CONDGEU    CONDCC
  71. #define CONDLU    CONDCS
  72.  
  73. #define FCONDA        (COND(0x8))
  74. #define FCONDE        (COND(0x9))
  75. #define FCONDG        (COND(0x6))
  76. #define FCONDGE        (COND(0xb))
  77. #define FCONDL        (COND(0x4))
  78. #define FCONDLE        (COND(0xd))
  79. #define FCONDLG        (COND(0x2))
  80. #define FCONDN        (COND(0x0))
  81. #define FCONDNE        (COND(0x1))
  82. #define FCONDO        (COND(0xf))
  83. #define FCONDU        (COND(0x7))
  84. #define FCONDUE        (COND(0xa))
  85. #define FCONDUG        (COND(0x5))
  86. #define FCONDUGE    (COND(0xc))
  87. #define FCONDUL        (COND(0x3))
  88. #define FCONDULE    (COND(0xe))
  89.  
  90. #define FCONDNZ    FCONDNE
  91. #define FCONDZ    FCONDE
  92.  
  93. #define ICC (0)    /* v9 */
  94. #define XCC (1<<12) /* v9 */
  95. #define FCC(x)    (((x)&0x3)<<11) /* v9 */
  96. #define FBFCC(x)    (((x)&0x3)<<20)    /* v9 */
  97.  
  98. /* The order of the opcodes in the table is significant:
  99.     
  100.     * The assembler requires that all instances of the same mnemonic must
  101.     be consecutive.    If they aren't, the assembler will bomb at runtime.
  102.  
  103.     * The disassembler should not care about the order of the opcodes.
  104.  
  105. */
  106.  
  107. struct sparc_opcode sparc_opcodes[] = {
  108.  
  109. { "ld",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0),        "[1+2],d", 0, v6 },
  110. { "ld",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,    "[1],d", 0, v6 }, /* ld [rs1+%g0],d */
  111. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[1+i],d", 0, v6 },
  112. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[i+1],d", 0, v6 },
  113. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,    "[i],d", 0, v6 },
  114. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ld [rs1+0],d */
  115. { "ld",    F3(3, 0x20, 0), F3(~3, ~0x20, ~0),        "[1+2],g", 0, v6 },
  116. { "ld",    F3(3, 0x20, 0), F3(~3, ~0x20, ~0)|RS2_G0,    "[1],g", 0, v6 }, /* ld [rs1+%g0],d */
  117. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1),        "[1+i],g", 0, v6 },
  118. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1),        "[i+1],g", 0, v6 },
  119. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|RS1_G0,    "[i],g", 0, v6 },
  120. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|SIMM13(~0),    "[1],g", 0, v6 }, /* ld [rs1+0],d */
  121.  
  122. { "ld",    F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RD(~0),    "[1+2],F", 0, v6 },
  123. { "ld",    F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RS2_G0|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+%g0],d */
  124. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),    "[1+i],F", 0, v6 },
  125. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),    "[i+1],F", 0, v6 },
  126. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~0),"[i],F", 0, v6 },
  127. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+0],d */
  128.  
  129. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  130.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  131. { "ld",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0),        "[1+2],D", F_ALIAS, v6 },
  132. { "ld",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,    "[1],D", F_ALIAS, v6 }, /* ld [rs1+%g0],d */
  133. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[1+i],D", F_ALIAS, v6 },
  134. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[i+1],D", F_ALIAS, v6 },
  135. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,    "[i],D", F_ALIAS, v6 },
  136. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),    "[1],D", F_ALIAS, v6 }, /* ld [rs1+0],d */
  137. { "ld",    F3(3, 0x31, 0), F3(~3, ~0x31, ~0),        "[1+2],C", 0, v6 },
  138. { "ld",    F3(3, 0x31, 0), F3(~3, ~0x31, ~0)|RS2_G0,    "[1],C", 0, v6 }, /* ld [rs1+%g0],d */
  139. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1),        "[1+i],C", 0, v6 },
  140. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1),        "[i+1],C", 0, v6 },
  141. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|RS1_G0,    "[i],C", 0, v6 },
  142. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|SIMM13(~0),    "[1],C", 0, v6 }, /* ld [rs1+0],d */
  143.  
  144. /* The v9 LDUW is the same as the old 'ld' opcode, it is not the same as the
  145.    'ld' pseudo-op in v9.  */
  146. { "lduw",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0),        "[1+2],d", F_ALIAS, v9 },
  147. { "lduw",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,    "[1],d", F_ALIAS, v9 }, /* ld [rs1+%g0],d */
  148. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[1+i],d", F_ALIAS, v9 },
  149. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[i+1],d", F_ALIAS, v9 },
  150. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,    "[i],d", F_ALIAS, v9 },
  151. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),    "[1],d", F_ALIAS, v9 }, /* ld [rs1+0],d */
  152.  
  153. { "ldd",    F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  154. { "ldd",    F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldd [rs1+%g0],d */
  155. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1),        "[1+i],d", 0, v6 },
  156. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1),        "[i+1],d", 0, v6 },
  157. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|RS1_G0,    "[i],d", 0, v6 },
  158. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldd [rs1+0],d */
  159. { "ldd",    F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI(~0),    "[1+2],H", 0, v6 },
  160. { "ldd",    F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI_RS2(~0),    "[1],H", 0, v6 }, /* ldd [rs1+%g0],d */
  161. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1),        "[1+i],H", 0, v6 },
  162. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1),        "[i+1],H", 0, v6 },
  163. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|RS1_G0,    "[i],H", 0, v6 },
  164. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|SIMM13(~0),    "[1],H", 0, v6 }, /* ldd [rs1+0],d */
  165. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  166.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  167. { "ldd",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI(~0),    "[1+2],D", F_ALIAS, v6 },
  168. { "ldd",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI_RS2(~0),    "[1],D", F_ALIAS, v6 }, /* ldd [rs1+%g0],d */
  169. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[1+i],D", F_ALIAS, v6 },
  170. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[i+1],D", F_ALIAS, v6 },
  171. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,    "[i],D", F_ALIAS, v6 },
  172. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),    "[1],D", F_ALIAS, v6 }, /* ldd [rs1+0],d */
  173.  
  174. { "ldq",    F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI(~0),    "[1+2],J", 0, v9 },
  175. { "ldq",    F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI_RS2(~0),    "[1],J", 0, v9 }, /* ldd [rs1+%g0],d */
  176. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1),        "[1+i],J", 0, v9 },
  177. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1),        "[i+1],J", 0, v9 },
  178. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|RS1_G0,    "[i],J", 0, v9 },
  179. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|SIMM13(~0),    "[1],J", 0, v9 }, /* ldd [rs1+0],d */
  180.  
  181. { "ldsb",    F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  182. { "ldsb",    F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldsb [rs1+%g0],d */
  183. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1),        "[1+i],d", 0, v6 },
  184. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1),        "[i+1],d", 0, v6 },
  185. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|RS1_G0,    "[i],d", 0, v6 },
  186. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldsb [rs1+0],d */
  187.  
  188. { "ldsh",    F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldsh [rs1+%g0],d */
  189. { "ldsh",    F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  190. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),        "[1+i],d", 0, v6 },
  191. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),        "[i+1],d", 0, v6 },
  192. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|RS1_G0,    "[i],d", 0, v6 },
  193. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldsh [rs1+0],d */
  194.  
  195. { "ldstub",    F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  196. { "ldstub",    F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldstub [rs1+%g0],d */
  197. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),        "[1+i],d", 0, v6 },
  198. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),        "[i+1],d", 0, v6 },
  199. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|RS1_G0,    "[i],d", 0, v6 },
  200. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldstub [rs1+0],d */
  201.  
  202. { "ldsw",    F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI(~0),    "[1+2],d", 0, v9 },
  203. { "ldsw",    F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI_RS2(~0),    "[1],d", 0, v9 }, /* ldsw [rs1+%g0],d */
  204. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1),        "[1+i],d", 0, v9 },
  205. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1),        "[i+1],d", 0, v9 },
  206. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|RS1_G0,    "[i],d", 0, v9 },
  207. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|SIMM13(~0),    "[1],d", 0, v9 }, /* ldsw [rs1+0],d */
  208.  
  209. { "ldub",    F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  210. { "ldub",    F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldub [rs1+%g0],d */
  211. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1),        "[1+i],d", 0, v6 },
  212. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1),        "[i+1],d", 0, v6 },
  213. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|RS1_G0,    "[i],d", 0, v6 },
  214. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldub [rs1+0],d */
  215.  
  216. { "lduh",    F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  217. { "lduh",    F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* lduh [rs1+%g0],d */
  218. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1),        "[1+i],d", 0, v6 },
  219. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1),        "[i+1],d", 0, v6 },
  220. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|RS1_G0,    "[i],d", 0, v6 },
  221. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* lduh [rs1+0],d */
  222.  
  223. { "ldx",    F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI(~0),    "[1+2],d", 0, v9 },
  224. { "ldx",    F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI_RS2(~0),    "[1],d", 0, v9 }, /* ldx [rs1+%g0],d */
  225. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),        "[1+i],d", 0, v9 },
  226. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),        "[i+1],d", 0, v9 },
  227. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|RS1_G0,    "[i],d", 0, v9 },
  228. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|SIMM13(~0),    "[1],d", 0, v9 }, /* ldx [rs1+0],d */
  229.  
  230. { "ldx",    F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RD(~1),    "[1+2],F", 0, v9 },
  231. { "ldx",    F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RS2_G0|RD(~1),    "[1],F", 0, v9 }, /* ld [rs1+%g0],d */
  232. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1),    "[1+i],F", 0, v9 },
  233. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1),    "[i+1],F", 0, v9 },
  234. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~1),    "[i],F", 0, v9 },
  235. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~1),"[1],F", 0, v9 }, /* ld [rs1+0],d */
  236.  
  237. { "lda",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0),        "[1+2]A,d", 0, v6 },
  238. { "lda",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* lda [rs1+%g0],d */
  239. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[1+i]o,d", 0, v9 },
  240. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[i+1]o,d", 0, v9 },
  241. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  242. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  243. { "lda",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0),        "[1+2]A,g", 0, v9 },
  244. { "lda",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,    "[1]A,g", 0, v9 }, /* lda [rs1+%g0],d */
  245. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[1+i]o,g", 0, v9 },
  246. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[i+1]o,g", 0, v9 },
  247. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,    "[i]o,g", 0, v9 },
  248. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),    "[1]o,g", 0, v9 }, /* ld [rs1+0],d */
  249.  
  250. { "ldda",    F3(3, 0x13, 0), F3(~3, ~0x13, ~0),        "[1+2]A,d", 0, v6 },
  251. { "ldda",    F3(3, 0x13, 0), F3(~3, ~0x13, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldda [rs1+%g0],d */
  252. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1),        "[1+i]o,d", 0, v9 },
  253. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1),        "[i+1]o,d", 0, v9 },
  254. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  255. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  256.  
  257. { "ldda",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0),        "[1+2]A,H", 0, v9 },
  258. { "ldda",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|RS2_G0,    "[1]A,H", 0, v9 }, /* ldda [rs1+%g0],d */
  259. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[1+i]o,H", 0, v9 },
  260. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[i+1]o,H", 0, v9 },
  261. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,    "[i]o,H", 0, v9 },
  262. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),    "[1]o,H", 0, v9 }, /* ld [rs1+0],d */
  263.  
  264. { "ldqa",    F3(3, 0x32, 0), F3(~3, ~0x32, ~0),        "[1+2]A,J", 0, v9 },
  265. { "ldqa",    F3(3, 0x32, 0), F3(~3, ~0x32, ~0)|RS2_G0,    "[1]A,J", 0, v9 }, /* ldd [rs1+%g0],d */
  266. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1),        "[1+i]o,J", 0, v9 },
  267. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1),        "[i+1]o,J", 0, v9 },
  268. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|RS1_G0,    "[i]o,J", 0, v9 },
  269. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|SIMM13(~0),    "[1]o,J", 0, v9 }, /* ldd [rs1+0],d */
  270.  
  271. { "ldsba",    F3(3, 0x19, 0), F3(~3, ~0x19, ~0),        "[1+2]A,d", 0, v6 },
  272. { "ldsba",    F3(3, 0x19, 0), F3(~3, ~0x19, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldsba [rs1+%g0],d */
  273. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1),        "[1+i]o,d", 0, v9 },
  274. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1),        "[i+1]o,d", 0, v9 },
  275. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  276. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  277.  
  278. { "ldsha",    F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0),        "[1+2]A,d", 0, v6 },
  279. { "ldsha",    F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldsha [rs1+%g0],d */
  280. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),        "[1+i]o,d", 0, v9 },
  281. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),        "[i+1]o,d", 0, v9 },
  282. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  283. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  284.  
  285. { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0),        "[1+2]A,d", 0, v6 },
  286. { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldstuba [rs1+%g0],d */
  287. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),        "[1+i]o,d", 0, v9 },
  288. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),        "[i+1]o,d", 0, v9 },
  289. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  290. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  291.  
  292. { "ldswa",    F3(3, 0x18, 0), F3(~3, ~0x18, ~0),        "[1+2]A,d", 0, v9 },
  293. { "ldswa",    F3(3, 0x18, 0), F3(~3, ~0x18, ~0)|RS2_G0,    "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
  294. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1),        "[1+i]o,d", 0, v9 },
  295. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1),        "[i+1]o,d", 0, v9 },
  296. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  297. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  298.  
  299. { "lduba",    F3(3, 0x11, 0), F3(~3, ~0x11, ~0),        "[1+2]A,d", 0, v6 },
  300. { "lduba",    F3(3, 0x11, 0), F3(~3, ~0x11, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* lduba [rs1+%g0],d */
  301. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1),        "[1+i]o,d", 0, v9 },
  302. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1),        "[i+1]o,d", 0, v9 },
  303. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  304. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  305.  
  306. { "lduha",    F3(3, 0x12, 0), F3(~3, ~0x12, ~0),        "[1+2]A,d", 0, v6 },
  307. { "lduha",    F3(3, 0x12, 0), F3(~3, ~0x12, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* lduha [rs1+%g0],d */
  308. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1),        "[1+i]o,d", 0, v9 },
  309. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1),        "[i+1]o,d", 0, v9 },
  310. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  311. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  312.  
  313. { "lduwa",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0),        "[1+2]A,d", F_ALIAS, v9 }, /* lduwa === lda */
  314. { "lduwa",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,    "[1]A,d", F_ALIAS, v9 }, /* lda [rs1+%g0],d */
  315. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[1+i]o,d", F_ALIAS, v9 },
  316. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[i+1]o,d", F_ALIAS, v9 },
  317. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,    "[i]o,d", F_ALIAS, v9 },
  318. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),    "[1]o,d", F_ALIAS, v9 }, /* ld [rs1+0],d */
  319.  
  320. { "ldxa",    F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0),        "[1+2]A,d", 0, v9 }, /* lduwa === lda */
  321. { "ldxa",    F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0)|RS2_G0,    "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
  322. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),        "[1+i]o,d", 0, v9 },
  323. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),        "[i+1]o,d", 0, v9 },
  324. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  325. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  326.  
  327. { "st",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),        "d,[1+2]", 0, v6 },
  328. { "st",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),        "d,[1]", 0, v6 }, /* st d,[rs1+%g0] */
  329. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),            "d,[1+i]", 0, v6 },
  330. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),            "d,[i+1]", 0, v6 },
  331. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,        "d,[i]", 0, v6 },
  332. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),        "d,[1]", 0, v6 }, /* st d,[rs1+0] */
  333. { "st",    F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI(~0),        "g,[1+2]", 0, v6 },
  334. { "st",    F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI_RS2(~0),        "g,[1]", 0, v6 }, /* st d[rs1+%g0] */
  335. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1),            "g,[1+i]", 0, v6 },
  336. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1),            "g,[i+1]", 0, v6 },
  337. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|RS1_G0,        "g,[i]", 0, v6 },
  338. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|SIMM13(~0),        "g,[1]", 0, v6 }, /* st d,[rs1+0] */
  339. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  340.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  341. { "st",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI(~0),        "D,[1+2]", F_ALIAS, v6 },
  342. { "st",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI_RS2(~0),        "D,[1]", F_ALIAS, v6 }, /* st d,[rs1+%g0] */
  343. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),            "D,[1+i]", F_ALIAS, v6 },
  344. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),            "D,[i+1]", F_ALIAS, v6 },
  345. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,        "D,[i]", F_ALIAS, v6 },
  346. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),        "D,[1]", F_ALIAS, v6 }, /* st d,[rs1+0] */
  347. { "st",    F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI(~0),        "C,[1+2]", 0, v6 },
  348. { "st",    F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI_RS2(~0),        "C,[1]", 0, v6 }, /* st d,[rs1+%g0] */
  349. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1),            "C,[1+i]", 0, v6 },
  350. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1),            "C,[i+1]", 0, v6 },
  351. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|RS1_G0,        "C,[i]", 0, v6 },
  352. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|SIMM13(~0),        "C,[1]", 0, v6 }, /* st d,[rs1+0] */
  353.  
  354. { "st",    F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI(~0),    "F,[1+2]", 0, v6 },
  355. { "st",    F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI_RS2(~0),    "F,[1]", 0, v6 }, /* st d,[rs1+%g0] */
  356. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,        "F,[1+i]", 0, v6 },
  357. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,        "F,[i+1]", 0, v6 },
  358. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|RS1_G0,        "F,[i]", 0, v6 },
  359. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|SIMM13(~0),    "F,[1]", 0, v6 }, /* st d,[rs1+0] */
  360.  
  361. { "stw",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),    "d,[1+2]", F_ALIAS, v9 },
  362. { "stw",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),    "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
  363. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),        "d,[1+i]", F_ALIAS, v9 },
  364. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),        "d,[i+1]", F_ALIAS, v9 },
  365. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,    "d,[i]", F_ALIAS, v9 },
  366. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),    "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
  367.  
  368. { "sta",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0),        "d,[1+2]A", 0, v6 },
  369. { "sta",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* sta d,[rs1+%g0] */
  370. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[1+i]o", 0, v9 },
  371. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[i+1]o", 0, v9 },
  372. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  373. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* st d,[rs1+0] */
  374.  
  375. { "sta",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0),        "g,[1+2]A", 0, v9 },
  376. { "sta",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|RS2(~0),    "g,[1]A", 0, v9 }, /* sta d,[rs1+%g0] */
  377. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),        "g,[1+i]o", 0, v9 },
  378. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),        "g,[i+1]o", 0, v9 },
  379. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,    "g,[i]o", 0, v9 },
  380. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),    "g,[1]o", 0, v9 }, /* st d,[rs1+0] */
  381.  
  382. { "stwa",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0),        "d,[1+2]A", F_ALIAS, v9 },
  383. { "stwa",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),    "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
  384. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[1+i]o", F_ALIAS, v9 },
  385. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[i+1]o", F_ALIAS, v9 },
  386. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,    "d,[i]o", F_ALIAS, v9 },
  387. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),    "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
  388.  
  389. { "stb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),    "d,[1+2]", 0, v6 },
  390. { "stb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),    "d,[1]", 0, v6 }, /* stb d,[rs1+%g0] */
  391. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1),        "d,[1+i]", 0, v6 },
  392. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1),        "d,[i+1]", 0, v6 },
  393. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,    "d,[i]", 0, v6 },
  394. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),    "d,[1]", 0, v6 }, /* stb d,[rs1+0] */
  395.  
  396. { "stba",    F3(3, 0x15, 0), F3(~3, ~0x15, ~0),        "d,[1+2]A", 0, v6 },
  397. { "stba",    F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* stba d,[rs1+%g0] */
  398. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1),        "d,[1+i]o", 0, v9 },
  399. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1),        "d,[i+1]o", 0, v9 },
  400. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  401. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* stb d,[rs1+0] */
  402.  
  403. { "std",    F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI(~0),    "d,[1+2]", 0, v6 },
  404. { "std",    F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI_RS2(~0),    "d,[1]", 0, v6 }, /* std d,[rs1+%g0] */
  405. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1),        "d,[1+i]", 0, v6 },
  406. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1),        "d,[i+1]", 0, v6 },
  407. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|RS1_G0,    "d,[i]", 0, v6 },
  408. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|SIMM13(~0),    "d,[1]", 0, v6 }, /* std d,[rs1+0] */
  409. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  410.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  411. { "std",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),    "q,[1+2]", F_ALIAS, v6 },
  412. { "std",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),    "q,[1]", F_ALIAS, v6 }, /* std d,[rs1+%g0] */
  413. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "q,[1+i]", F_ALIAS, v6 },
  414. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "q,[i+1]", F_ALIAS, v6 },
  415. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,    "q,[i]", F_ALIAS, v6 },
  416. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),    "q,[1]", F_ALIAS, v6 }, /* std d,[rs1+0] */
  417. { "std",    F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI(~0),    "H,[1+2]", 0, v6 },
  418. { "std",    F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI_RS2(~0),    "H,[1]", 0, v6 }, /* std d,[rs1+%g0] */
  419. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1),        "H,[1+i]", 0, v6 },
  420. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1),        "H,[i+1]", 0, v6 },
  421. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|RS1_G0,    "H,[i]", 0, v6 },
  422. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|SIMM13(~0),    "H,[1]", 0, v6 }, /* std d,[rs1+0] */
  423. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  424.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  425. { "std",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),    "Q,[1+2]", F_ALIAS, v6 },
  426. { "std",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),    "Q,[1]", F_ALIAS, v6 }, /* std d,[rs1+%g0] */
  427. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "Q,[1+i]", F_ALIAS, v6 },
  428. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "Q,[i+1]", F_ALIAS, v6 },
  429. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,    "Q,[i]", F_ALIAS, v6 },
  430. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),    "Q,[1]", F_ALIAS, v6 }, /* std d,[rs1+0] */
  431. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  432.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  433. { "std",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI(~0),    "D,[1+2]", F_ALIAS, v6 },
  434. { "std",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI_RS2(~0),    "D,[1]", F_ALIAS, v6 }, /* std d,[rs1+%g0] */
  435. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "D,[1+i]", F_ALIAS, v6 },
  436. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "D,[i+1]", F_ALIAS, v6 },
  437. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,    "D,[i]", F_ALIAS, v6 },
  438. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),    "D,[1]", F_ALIAS, v6 }, /* std d,[rs1+0] */
  439.  
  440. { "stda",    F3(3, 0x17, 0), F3(~3, ~0x17, ~0),        "d,[1+2]A", 0, v6 },
  441. { "stda",    F3(3, 0x17, 0), F3(~3, ~0x17, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* stda d,[rs1+%g0] */
  442. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1),        "d,[1+i]o", 0, v9 },
  443. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1),        "d,[i+1]o", 0, v9 },
  444. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  445. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* std d,[rs1+0] */
  446. { "stda",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0),        "H,[1+2]A", 0, v9 },
  447. { "stda",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|RS2(~0),    "H,[1]A", 0, v9 }, /* stda d,[rs1+%g0] */
  448. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "H,[1+i]o", 0, v9 },
  449. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "H,[i+1]o", 0, v9 },
  450. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,    "H,[i]o", 0, v9 },
  451. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),    "H,[1]o", 0, v9 }, /* std d,[rs1+0] */
  452.  
  453. { "sth",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),    "d,[1+2]", 0, v6 },
  454. { "sth",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),    "d,[1]", 0, v6 }, /* sth d,[rs1+%g0] */
  455. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1),        "d,[1+i]", 0, v6 },
  456. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1),        "d,[i+1]", 0, v6 },
  457. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,    "d,[i]", 0, v6 },
  458. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),    "d,[1]", 0, v6 }, /* sth d,[+] */
  459.  
  460. { "stha",    F3(3, 0x16, 0), F3(~3, ~0x16, ~0),        "d,[1+2]A", 0, v6 },
  461. { "stha",    F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* stha ,[+%] */
  462. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1),        "d,[1+i]o", 0, v9 },
  463. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1),        "d,[i+1]o", 0, v9 },
  464. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  465. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* sth d,[+] */
  466.  
  467. { "stx",    F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI(~0),    "d,[1+2]", 0, v9 },
  468. { "stx",    F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI_RS2(~0),    "d,[1]", 0, v9 }, /* stx d,[rs1+%g0] */
  469. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),        "d,[1+i]", 0, v9 },
  470. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),        "d,[i+1]", 0, v9 },
  471. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RS1_G0,    "d,[i]", 0, v9 },
  472. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|SIMM13(~0),    "d,[1]", 0, v9 }, /* stx d,[rs1+0] */
  473.  
  474. { "stx",    F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI(~0)|RD(~1),    "F,[1+2]", 0, v9 },
  475. { "stx",    F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI_RS2(~0)|RD(~1),"F,[1]", 0, v9 }, /* st d,[rs1+%g0] */
  476. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),        "F,[1+i]", 0, v9 },
  477. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),        "F,[i+1]", 0, v9 },
  478. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RS1_G0|RD(~1),    "F,[i]", 0, v9 },
  479. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|SIMM13(~0)|RD(~1),"F,[1]", 0, v9 }, /* st d,[rs1+0] */
  480.  
  481. { "stxa",    F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0),        "d,[1+2]A", 0, v9 },
  482. { "stxa",    F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0)|RS2(~0),    "d,[1]A", 0, v9 }, /* stha d,[rs1+%g0] */
  483. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),        "d,[1+i]o", 0, v9 },
  484. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),        "d,[i+1]o", 0, v9 },
  485. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  486. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* stx d,[rs1+0] */
  487.  
  488. { "stq",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),    "J,[1+2]", 0, v9 },
  489. { "stq",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),    "J,[1]", 0, v9 }, /* st d[rs1+%g0] */
  490. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "J,[1+i]", 0, v9 },
  491. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "J,[i+1]", 0, v9 },
  492. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,    "J,[i]", 0, v9 },
  493. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),    "J,[1]", 0, v9 }, /* st d,[rs1+0] */
  494.  
  495. { "stqa",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),    "J,[1+2]A", 0, v9 },
  496. { "stqa",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),    "J,[1]A", 0, v9 }, /* st d[rs1+%g0] */
  497. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "J,[1+i]o", 0, v9 },
  498. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "J,[i+1]o", 0, v9 },
  499. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,    "J,[i]o", 0, v9 },
  500. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),    "J,[1]o", 0, v9 }, /* st d,[rs1+0] */
  501.  
  502. { "swap",    F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI(~0),    "[1+2],d", 0, v7 },
  503. { "swap",    F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI_RS2(~0),    "[1],d", 0, v7 }, /* swap [rs1+%g0],d */
  504. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),        "[1+i],d", 0, v7 },
  505. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),        "[i+1],d", 0, v7 },
  506. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|RS1_G0,    "[i],d", 0, v7 },
  507. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|SIMM13(~0),    "[1],d", 0, v7 }, /* swap [rs1+0],d */
  508.  
  509. { "swapa",    F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0),        "[1+2]A,d", 0, v7 },
  510. { "swapa",    F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0)|RS2(~0),    "[1]A,d", 0, v7 }, /* swapa [rs1+%g0],d */
  511. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),        "[1+i]o,d", 0, v9 },
  512. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),        "[i+1]o,d", 0, v9 },
  513. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  514. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* swap [rs1+0],d */
  515.  
  516. { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|ASI(~0),            "1,2,d", 0, v6 },
  517. { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),    "", 0, v6 }, /* restore %g0,%g0,%g0 */
  518. { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1),                "1,i,d", 0, v6 },
  519. { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1)|RD_G0|RS1_G0|SIMM13(~0),    "", 0, v6 }, /* restore %g0,0,%g0 */
  520.  
  521. { "rett",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI(~0),    "1+2", F_UNBR|F_DELAYED, v6 }, /* rett rs1+rs2 */
  522. { "rett",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1,%g0 */
  523. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,    "1+i", F_UNBR|F_DELAYED, v6 }, /* rett rs1+X */
  524. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,    "i+1", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
  525. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,"i", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
  526. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,    "i", F_UNBR|F_DELAYED, v6 },    /* rett X */
  527. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|SIMM13(~0),    "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1+0 */
  528.  
  529. { "save",    F3(2, 0x3c, 0), F3(~2, ~0x3c, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  530. { "save",    F3(2, 0x3c, 1), F3(~2, ~0x3c, ~1),        "1,i,d", 0, v6 },
  531. { "save",    0x81e00000,    ~0x81e00000,    "", F_ALIAS, v6 },
  532.  
  533. { "ret",  F3(2, 0x38, 1)|RS1(0x1f)|SIMM13(8), F3(~2, ~0x38, ~1)|SIMM13(~8),           "", F_UNBR|F_DELAYED, v6 }, /* jmpl %i7+8,%g0 */
  534. { "retl", F3(2, 0x38, 1)|RS1(0x0f)|SIMM13(8), F3(~2, ~0x38, ~1)|RS1(~0x0f)|SIMM13(~8), "", F_UNBR|F_DELAYED, v6 }, /* jmpl %o7+8,%g0 */
  535.  
  536. { "jmpl",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI(~0),    "1+2,d", F_JSR|F_DELAYED, v6 },
  537. { "jmpl",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI_RS2(~0),    "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+%g0,d */
  538. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|SIMM13(~0),    "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+0,d */
  539. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RS1_G0,    "i,d", F_JSR|F_DELAYED, v6 }, /* jmpl %g0+i,d */
  540. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1),        "1+i,d", F_JSR|F_DELAYED, v6 },
  541. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1),        "i+1,d", F_JSR|F_DELAYED, v6 },
  542.  
  543. { "done",    F3(2, 0x3e, 0)|RD(0), F3(~2, ~0x3e, ~0)|RD(~0)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  544. { "retry",    F3(2, 0x3e, 0)|RD(1), F3(~2, ~0x3e, ~0)|RD(~1)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  545. { "saved",    F3(2, 0x31, 0)|RD(0), F3(~2, ~0x31, ~0)|RD(~0)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  546. { "restored",    F3(2, 0x31, 0)|RD(1), F3(~2, ~0x31, ~0)|RD(~1)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  547. { "sir",    F3(2, 0x30, 1)|RD(0xf), F3(~2, ~0x30, ~1)|RD(~0xf)|RS1_G0,        "i", 0, v9 },
  548.  
  549. { "flush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),    "1+2", 0, v8 },
  550. { "flush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),    "1", 0, v8 }, /* flush rs1+%g0 */
  551. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),    "1", 0, v8 }, /* flush rs1+0 */
  552. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,    "i", 0, v8 }, /* flush %g0+i */
  553. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "1+i", 0, v8 },
  554. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "i+1", 0, v8 },
  555.  
  556. /* IFLUSH was renamed to FLUSH in v8.  */
  557. { "iflush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),    "1+2", F_ALIAS, v6 },
  558. { "iflush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),    "1", F_ALIAS, v6 }, /* flush rs1+%g0 */
  559. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),    "1", F_ALIAS, v6 }, /* flush rs1+0 */
  560. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,    "i", F_ALIAS, v6 },
  561. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "1+i", F_ALIAS, v6 },
  562. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "i+1", F_ALIAS, v6 },
  563.  
  564. { "return",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI(~0),    "1+2", 0, v9 },
  565. { "return",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI_RS2(~0),    "1", 0, v9 }, /* return rs1+%g0 */
  566. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|SIMM13(~0),    "1", 0, v9 }, /* return rs1+0 */
  567. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RS1_G0,    "i", 0, v9 }, /* return %g0+i */
  568. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1),        "1+i", 0, v9 },
  569. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1),        "i+1", 0, v9 },
  570.  
  571. { "flushw",    F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),    "", 0, v9 },
  572.  
  573. { "membar",    F3(2, 0x28, 1)|RS1(0xf), F3(~2, ~0x28, ~1)|RD_G0|RS1(~0xf)|SIMM13(~0), "K", 0, v9 },
  574. { "stbar",    F3(2, 0x28, 0)|RS1(0xf), F3(~2, ~0x28, ~0)|RD_G0|RS1(~0xf)|SIMM13(~0),    "", 0, v8 },
  575.  
  576. { "prefetch",    F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0),        "[1+2],*", 0, v9 },
  577. { "prefetch",    F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0)|RS2_G0,    "[1],*", 0, v9 }, /* prefetch [rs1+%g0],prefetch_fcn */
  578. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),        "[1+i],*", 0, v9 },
  579. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),        "[i+1],*", 0, v9 },
  580. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|RS1_G0,    "[i],*", 0, v9 },
  581. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|SIMM13(~0),    "[1],*", 0, v9 }, /* prefetch [rs1+0],prefetch_fcn */
  582. { "prefetcha",    F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0),        "[1+2]A,*", 0, v9 },
  583. { "prefetcha",    F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0)|RS2_G0,    "[1]A,*", 0, v9 }, /* prefetcha [rs1+%g0],prefetch_fcn */
  584. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),        "[1+i]o,d", 0, v9 },
  585. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),        "[i+1]o,d", 0, v9 },
  586. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  587. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* prefetcha [rs1+0],d */
  588.  
  589.  /* The 1<<12 is a long story.  It is necessary.  For more info, please contact rich@cygnus.com */
  590. { "sll",    F3(2, 0x25, 0), F3(~2, ~0x25, ~0)|(1<<12)|ASI(~0),    "1,2,d", 0, v6 },
  591. { "sll",    F3(2, 0x25, 1), F3(~2, ~0x25, ~1)|(1<<12),        "1,i,d", 0, v6 },
  592. { "sra",    F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|ASI(~0),    "1,2,d", 0, v6 },
  593. { "sra",    F3(2, 0x27, 1), F3(~2, ~0x27, ~1)|(1<<12),        "1,i,d", 0, v6 },
  594. { "srl",    F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|ASI(~0),    "1,2,d", 0, v6 },
  595. { "srl",    F3(2, 0x26, 1), F3(~2, ~0x26, ~1)|(1<<12),        "1,i,d", 0, v6 },
  596.  
  597. { "sllx",    F3(2, 0x25, 0)|(1<<12), F3(~2, ~0x25, ~0)|(ASI(~0)^(1<<12)),    "1,2,d", 0, v9 },
  598. { "sllx",    F3(2, 0x25, 1)|(1<<12), F3(~2, ~0x25, ~1),        "1,i,d", 0, v9 },
  599. { "srax",    F3(2, 0x27, 0)|(1<<12), F3(~2, ~0x27, ~0)|(ASI(~0)^(1<<12)),    "1,2,d", 0, v9 },
  600. { "srax",    F3(2, 0x27, 1)|(1<<12), F3(~2, ~0x27, ~1),        "1,i,d", 0, v9 },
  601. { "srlx",    F3(2, 0x26, 0)|(1<<12), F3(~2, ~0x26, ~0)|(ASI(~0)^(1<<12)),    "1,2,d", 0, v9 },
  602. { "srlx",    F3(2, 0x26, 1)|(1<<12), F3(~2, ~0x26, ~1),        "1,i,d", 0, v9 },
  603.  
  604. { "mulscc",    F3(2, 0x24, 0), F3(~2, ~0x24, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  605. { "mulscc",    F3(2, 0x24, 1), F3(~2, ~0x24, ~1),        "1,i,d", 0, v6 },
  606.  
  607. { "divscc",    F3(2, 0x1d, 0), F3(~2, ~0x1d, ~0)|ASI(~0),    "1,2,d", 0, sparclite },
  608. { "divscc",    F3(2, 0x1d, 1), F3(~2, ~0x1d, ~1),        "1,i,d", 0, sparclite },
  609.  
  610. { "scan",    F3(2, 0x2c, 0), F3(~2, ~0x2c, ~0)|ASI(~0),    "1,2,d", 0, sparclite },
  611. { "scan",    F3(2, 0x2c, 1), F3(~2, ~0x2c, ~1),        "1,i,d", 0, sparclite },
  612.  
  613. { "popc",    F3(2, 0x2e, 0), F3(~2, ~0x2e, ~0)|RS2_G0|ASI(~0),"2,d", 0, v9 },
  614. { "popc",    F3(2, 0x2e, 1), F3(~2, ~0x2e, ~1)|RS2_G0,    "i,d", 0, v9 },
  615.  
  616. { "clr",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),    "d", F_ALIAS, v6 }, /* or %g0,%g0,d */
  617. { "clr",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0|SIMM13(~0),        "d", F_ALIAS, v6 }, /* or %g0,0,d    */
  618. { "clr",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v6 },
  619. { "clr",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI_RS2(~0),        "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+%g0] */
  620. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,            "[1+i]", F_ALIAS, v6 },
  621. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,            "[i+1]", F_ALIAS, v6 },
  622. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|RS1_G0,        "[i]", F_ALIAS, v6 },
  623. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|SIMM13(~0),        "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+0] */
  624.  
  625. { "clrb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI(~0),    "[1+2]", F_ALIAS, v6 },
  626. { "clrb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* stb %g0,[rs1+%g0] */
  627. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,        "[1+i]", F_ALIAS, v6 },
  628. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,        "[i+1]", F_ALIAS, v6 },
  629. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|RS1_G0,    "[i]", F_ALIAS, v6 },
  630. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|SIMM13(~0),    "[1]", F_ALIAS, v6 }, /* clrb [rs1+0],d */
  631.  
  632. { "clrh",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI(~0),    "[1+2]", F_ALIAS, v6 },
  633. { "clrh",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* sth %g0,[rs1+%g0] */
  634. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,        "[1+i]", F_ALIAS, v6 },
  635. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,        "[i+1]", F_ALIAS, v6 },
  636. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|RS1_G0,    "[i]", F_ALIAS, v6 },
  637. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|SIMM13(~0),    "[1]", F_ALIAS, v6 }, /* clrb [rs1+0],d */
  638.  
  639. { "orcc",    F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  640. { "orcc",    F3(2, 0x12, 1), F3(~2, ~0x12, ~1),        "1,i,d", 0, v6 },
  641. { "orcc",    F3(2, 0x12, 1), F3(~2, ~0x12, ~1),        "i,1,d", 0, v6 },
  642.  
  643. /* This is not a commutative instruction.  */
  644. { "orncc",    F3(2, 0x16, 0), F3(~2, ~0x16, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  645. { "orncc",    F3(2, 0x16, 1), F3(~2, ~0x16, ~1),        "1,i,d", 0, v6 },
  646.  
  647. /* This is not a commutative instruction.  */
  648. { "orn",    F3(2, 0x06, 0), F3(~2, ~0x06, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  649. { "orn",    F3(2, 0x06, 1), F3(~2, ~0x06, ~1),        "1,i,d", 0, v6 },
  650.  
  651. { "tst",    F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|ASI_RS2(~0),    "1", 0, v6 }, /* orcc rs1, %g0, %g0 */
  652. { "tst",    F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|RS1_G0|ASI(~0),    "2", 0, v6 }, /* orcc %g0, rs2, %g0 */
  653. { "tst",    F3(2, 0x12, 1), F3(~2, ~0x12, ~1)|RD_G0|SIMM13(~0),    "1", 0, v6 }, /* orcc rs1, 0, %g0 */
  654.  
  655. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  656.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  657. { "wr",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|ASI(~0),        "1,2,m", 0, v8 }, /* wr r,r,%asrX */
  658. { "wr",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),    "1,2,y", 0, v6 }, /* wr r,r,%y */
  659. { "wr",    F3(2, 0x30, 1),        F3(~2, ~0x30, ~1),            "1,i,m", 0, v8 }, /* wr r,i,%asrX */
  660. { "wr",    F3(2, 0x30, 1),        F3(~2, ~0x30, ~1)|RD_G0,        "1,i,y", 0, v6 }, /* wr r,i,%y */
  661. { "wr",    F3(2, 0x31, 0),        F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),    "1,2,p", F_ALIAS, v6 }, /* wr r,r,%psr */
  662. { "wr",    F3(2, 0x31, 1),        F3(~2, ~0x31, ~1)|RD_G0,        "1,i,p", F_ALIAS, v6 }, /* wr r,i,%psr */
  663. { "wr",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),    "1,2,w", F_ALIAS, v6 }, /* wr r,r,%wim */
  664. { "wr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1)|RD_G0,        "1,i,w", F_ALIAS, v6 }, /* wr r,i,%wim */
  665. { "wr",    F3(2, 0x33, 0),        F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),    "1,2,t", F_ALIAS, v6 }, /* wr r,r,%tbr */
  666. { "wr",    F3(2, 0x33, 1),        F3(~2, ~0x33, ~1)|RD_G0,        "1,i,t", F_ALIAS, v6 }, /* wr r,i,%tbr */
  667.  
  668. { "wr", F3(2, 0x30, 0)|RD(0), F3(~2, ~0x30, ~0)|RD(~0)|ASI(~0), "1,2,y", 0, v9 }, /* wr r,r,%y */
  669. { "wr", F3(2, 0x30, 1)|RD(0), F3(~2, ~0x30, ~1)|RD(~0),        "1,i,y", 0, v9 }, /* wr r,i,%y */
  670. { "wr", F3(2, 0x30, 0)|RD(2), F3(~2, ~0x30, ~0)|RD(~2)|ASI(~0), "1,2,E", 0, v9 }, /* wr r,r,%ccr */
  671. { "wr", F3(2, 0x30, 1)|RD(2), F3(~2, ~0x30, ~1)|RD(~2),        "1,i,E", 0, v9 }, /* wr r,i,%ccr */
  672. { "wr", F3(2, 0x30, 0)|RD(3), F3(~2, ~0x30, ~0)|RD(~3)|ASI(~0), "1,2,o", 0, v9 }, /* wr r,r,%asi */
  673. { "wr", F3(2, 0x30, 1)|RD(3), F3(~2, ~0x30, ~1)|RD(~3),        "1,i,o", 0, v9 }, /* wr r,i,%asi */
  674. { "wr", F3(2, 0x30, 0)|RD(6), F3(~2, ~0x30, ~0)|RD(~6)|ASI(~0), "1,2,s", 0, v9 }, /* wr r,i,%fprs */
  675. { "wr", F3(2, 0x30, 1)|RD(6), F3(~2, ~0x30, ~1)|RD(~6),        "1,i,s", 0, v9 }, /* wr r,i,%fprs */
  676.  
  677. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  678.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  679. { "rd",    F3(2, 0x28, 0),            F3(~2, ~0x28, ~0)|SIMM13(~0),        "M,d", 0, v8 }, /* rd %asrX,r */
  680. { "rd",    F3(2, 0x28, 0),            F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),    "y,d", 0, v6 }, /* rd %y,r */
  681. { "rd",    F3(2, 0x29, 0),            F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),    "p,d", F_ALIAS, v6 }, /* rd %psr,r */
  682. { "rd",    F3(2, 0x2a, 0),            F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", F_ALIAS, v6 }, /* rd %wim,r */
  683. { "rd",    F3(2, 0x2b, 0),            F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", F_ALIAS, v6 }, /* rd %tbr,r */
  684.  
  685. { "rd",    F3(2, 0x28, 0)|RS1(2),        F3(~2, ~0x28, ~0)|RS1(~2)|SIMM13(~0),    "E,d", 0, v9 }, /* rd %ccr,r */
  686. { "rd",    F3(2, 0x28, 0)|RS1(3),        F3(~2, ~0x28, ~0)|RS1(~3)|SIMM13(~0),    "o,d", 0, v9 }, /* rd %asi,r */
  687. { "rd",    F3(2, 0x28, 0)|RS1(4),        F3(~2, ~0x28, ~0)|RS1(~4)|SIMM13(~0),    "W,d", 0, v9 }, /* rd %tick,r */
  688. { "rd",    F3(2, 0x28, 0)|RS1(5),        F3(~2, ~0x28, ~0)|RS1(~5)|SIMM13(~0),    "P,d", 0, v9 }, /* rd %pc,r */
  689. { "rd",    F3(2, 0x28, 0)|RS1(6),        F3(~2, ~0x28, ~0)|RS1(~6)|SIMM13(~0),    "s,d", 0, v9 }, /* rd %fprs,r */
  690.  
  691. { "rdpr",    F3(2, 0x2a, 0),        F3(~2, ~0x2a, ~0)|SIMM13(~0),    "?,d", 0, v9 },   /* rdpr %priv,r */
  692. { "wrpr",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0),        "1,2,!", 0, v9 }, /* wrpr r1,r2,%priv */
  693. { "wrpr",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0)|SIMM13(~0),    "1,!", 0, v9 },   /* wrpr r1,%priv */
  694. { "wrpr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1),        "1,i,!", 0, v9 }, /* wrpr r1,i,%priv */
  695. { "wrpr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1),        "i,1,!", F_ALIAS, v9 }, /* wrpr i,r1,%priv */
  696. { "wrpr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1)|RS1(~0),    "i,!", 0, v9 },   /* wrpr i,%priv */
  697.  
  698. { "mov",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|ASI(~0),        "1,2,m", F_ALIAS, v8 }, /* wr r,r,%asrX */
  699. { "mov",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),    "1,2,y", F_ALIAS, v6 }, /* wr r,r,%y */
  700. { "mov",    F3(2, 0x30, 1),        F3(~2, ~0x30, ~1),            "1,i,m", F_ALIAS, v8 }, /* wr r,i,%asrX */
  701. { "mov",    F3(2, 0x30, 1),        F3(~2, ~0x30, ~1)|RD_G0,        "1,i,y", F_ALIAS, v6 }, /* wr r,i,%y */
  702. { "mov",    F3(2, 0x31, 0),        F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),    "1,2,p", F_ALIAS, v6 }, /* wr r,r,%psr */
  703. { "mov",    F3(2, 0x31, 1),        F3(~2, ~0x31, ~1)|RD_G0,        "1,i,p", F_ALIAS, v6 }, /* wr r,i,%psr */
  704. { "mov",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),    "1,2,w", F_ALIAS, v6 }, /* wr r,r,%wim */
  705. { "mov",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1)|RD_G0,        "1,i,w", F_ALIAS, v6 }, /* wr r,i,%wim */
  706. { "mov",    F3(2, 0x33, 0),        F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),    "1,2,t", F_ALIAS, v6 }, /* wr r,r,%tbr */
  707. { "mov",    F3(2, 0x33, 1),        F3(~2, ~0x33, ~1)|RD_G0,        "1,i,t", F_ALIAS, v6 }, /* wr r,i,%tbr */
  708.  
  709. /* v9: FIXME: On disassembly, rd %wim,r still gets preferred to rdpr %tpc,r.
  710.    v9: This is because the former is stricter in which bits can be set and
  711.    v9: compare_opcodes() will prefer it, even though F_ALIAS is set.
  712.    v9: Methinks we will need some sort of F_NOTFORV9 flag.  */
  713. { "mov",    F3(2, 0x28, 0),         F3(~2, ~0x28, ~0)|SIMM13(~0),            "M,d", F_ALIAS, v8 }, /* rd %asr1,r */
  714. { "mov",    F3(2, 0x28, 0),         F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),        "y,d", F_ALIAS, v6 }, /* rd %y,r */
  715. { "mov",    F3(2, 0x29, 0),         F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),        "p,d", F_ALIAS, v6 }, /* rd %psr,r */
  716. { "mov",    F3(2, 0x2a, 0),         F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),        "w,d", F_ALIAS, v6 }, /* rd %wim,r */
  717. { "mov",    F3(2, 0x2b, 0),         F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),        "t,d", F_ALIAS, v6 }, /* rd %tbr,r */
  718.  
  719. { "mov",    F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
  720. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1),        "i,y", F_ALIAS, v6 },
  721. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|SIMM13(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,0,%y */
  722. { "mov",    F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|ASI_RS2(~0),    "1,p", F_ALIAS, v6 }, /* wr rs1,%g0,%psr */
  723. { "mov",    F3(2, 0x31, 1), F3(~2, ~0x31, ~1),        "i,p", F_ALIAS, v6 },
  724. { "mov",    F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|SIMM13(~0),    "1,p", F_ALIAS, v6 }, /* wr rs1,0,%psr */
  725. { "mov",    F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|ASI_RS2(~0),    "1,w", F_ALIAS, v6 }, /* wr rs1,%g0,%wim */
  726. { "mov",    F3(2, 0x32, 1), F3(~2, ~0x32, ~1),        "i,w", F_ALIAS, v6 },
  727. { "mov",    F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|SIMM13(~0),    "1,w", F_ALIAS, v6 }, /* wr rs1,0,%wim */
  728. { "mov",    F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|ASI_RS2(~0),    "1,t", F_ALIAS, v6 }, /* wr rs1,%g0,%tbr */
  729. { "mov",    F3(2, 0x33, 1), F3(~2, ~0x33, ~1),        "i,t", F_ALIAS, v6 },
  730. { "mov",    F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|SIMM13(~0),    "1,t", F_ALIAS, v6 }, /* wr rs1,0,%tbr */
  731.  
  732. { "mov",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RS1_G0|ASI(~0),    "2,d", 0, v6 }, /* or %g0,rs2,d */
  733. { "mov",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0,        "i,d", 0, v6 }, /* or %g0,i,d    */
  734. { "mov",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI_RS2(~0),        "1,d", 0, v6 }, /* or rs1,%g0,d   */
  735. { "mov",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|SIMM13(~0),        "1,d", 0, v6 }, /* or rs1,0,d */
  736.  
  737. { "or",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  738. { "or",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1),        "1,i,d", 0, v6 },
  739. { "or",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1),        "i,1,d", 0, v6 },
  740.  
  741. { "bset",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),    "2,r", F_ALIAS, v6 },    /* or rd,rs2,rd */
  742. { "bset",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1),        "i,r", F_ALIAS, v6 },    /* or rd,i,rd */
  743.  
  744. /* This is not a commutative instruction.  */
  745. { "andn",    F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  746. { "andn",    F3(2, 0x05, 1), F3(~2, ~0x05, ~1),        "1,i,d", 0, v6 },
  747.  
  748. /* This is not a commutative instruction.  */
  749. { "andncc",    F3(2, 0x15, 0), F3(~2, ~0x15, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  750. { "andncc",    F3(2, 0x15, 1), F3(~2, ~0x15, ~1),        "1,i,d", 0, v6 },
  751.  
  752. { "bclr",    F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),    "2,r", F_ALIAS, v6 },    /* andn rd,rs2,rd */
  753. { "bclr",    F3(2, 0x05, 1), F3(~2, ~0x05, ~1),        "i,r", F_ALIAS, v6 },    /* andn rd,i,rd */
  754.  
  755. { "cmp",    F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|RD_G0|ASI(~0),    "1,2", 0, v6 },    /* subcc rs1,rs2,%g0 */
  756. { "cmp",    F3(2, 0x14, 1), F3(~2, ~0x14, ~1)|RD_G0,        "1,i", 0, v6 },    /* subcc rs1,i,%g0 */
  757.  
  758. { "sub",    F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  759. { "sub",    F3(2, 0x04, 1), F3(~2, ~0x04, ~1),        "1,i,d", 0, v6 },
  760.  
  761. { "subcc",    F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  762. { "subcc",    F3(2, 0x14, 1), F3(~2, ~0x14, ~1),        "1,i,d", 0, v6 },
  763.  
  764. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  765.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  766. { "subx",    F3(2, 0x0c, 0), F3(~2, ~0x0c, ~0)|ASI(~0),    "1,2,d", F_ALIAS, v6 },
  767. { "subx",    F3(2, 0x0c, 1), F3(~2, ~0x0c, ~1),        "1,i,d", F_ALIAS, v6 },
  768. { "subc",    F3(2, 0x0c, 0), F3(~2, ~0x0c, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  769. { "subc",    F3(2, 0x0c, 1), F3(~2, ~0x0c, ~1),        "1,i,d", 0, v9 },
  770.  
  771. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  772.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  773. { "subxcc",    F3(2, 0x1c, 0), F3(~2, ~0x1c, ~0)|ASI(~0),    "1,2,d", F_ALIAS, v6 },
  774. { "subxcc",    F3(2, 0x1c, 1), F3(~2, ~0x1c, ~1),        "1,i,d", F_ALIAS, v6 },
  775. { "subccc",    F3(2, 0x1c, 0), F3(~2, ~0x1c, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  776. { "subccc",    F3(2, 0x1c, 1), F3(~2, ~0x1c, ~1),        "1,i,d", 0, v9 },
  777.  
  778. { "and",    F3(2, 0x01, 0), F3(~2, ~0x01, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  779. { "and",    F3(2, 0x01, 1), F3(~2, ~0x01, ~1),        "1,i,d", 0, v6 },
  780. { "and",    F3(2, 0x01, 1), F3(~2, ~0x01, ~1),        "i,1,d", 0, v6 },
  781.  
  782. { "andcc",    F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  783. { "andcc",    F3(2, 0x11, 1), F3(~2, ~0x11, ~1),        "1,i,d", 0, v6 },
  784. { "andcc",    F3(2, 0x11, 1), F3(~2, ~0x11, ~1),        "i,1,d", 0, v6 },
  785.  
  786. { "dec",    F3(2, 0x04, 1)|SIMM13(0x1), F3(~2, ~0x04, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* sub rd,1,rd */
  787. { "dec",    F3(2, 0x04, 1),            F3(~2, ~0x04, ~1),               "i,r", F_ALIAS, v8 },    /* sub rd,imm,rd */
  788. { "deccc",    F3(2, 0x14, 1)|SIMM13(0x1), F3(~2, ~0x14, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* subcc rd,1,rd */
  789. { "deccc",    F3(2, 0x14, 1),            F3(~2, ~0x14, ~1),               "i,r", F_ALIAS, v8 },    /* subcc rd,imm,rd */
  790. { "inc",    F3(2, 0x00, 1)|SIMM13(0x1), F3(~2, ~0x00, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* add rd,1,rd */
  791. { "inc",    F3(2, 0x00, 1),            F3(~2, ~0x00, ~1),               "i,r", F_ALIAS, v8 },    /* add rd,imm,rd */
  792. { "inccc",    F3(2, 0x10, 1)|SIMM13(0x1), F3(~2, ~0x10, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* addcc rd,1,rd */
  793. { "inccc",    F3(2, 0x10, 1),            F3(~2, ~0x10, ~1),               "i,r", F_ALIAS, v8 },    /* addcc rd,imm,rd */
  794.  
  795. { "btst",    F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|RD_G0|ASI(~0), "1,2", F_ALIAS, v6 },    /* andcc rs1,rs2,%g0 */
  796. { "btst",    F3(2, 0x11, 1), F3(~2, ~0x11, ~1)|RD_G0, "i,1", F_ALIAS, v6 },    /* andcc rs1,i,%g0 */
  797.  
  798. { "neg",    F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "2,d", F_ALIAS, v6 }, /* sub %g0,rs2,rd */
  799. { "neg",    F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "r", F_ALIAS, v6 }, /* sub %g0,rd,rd */
  800.  
  801. { "add",    F3(2, 0x00, 0), F3(~2, ~0x00, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  802. { "add",    F3(2, 0x00, 1), F3(~2, ~0x00, ~1),        "1,i,d", 0, v6 },
  803. { "add",    F3(2, 0x00, 1), F3(~2, ~0x00, ~1),        "i,1,d", 0, v6 },
  804. { "addcc",    F3(2, 0x10, 0), F3(~2, ~0x10, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  805. { "addcc",    F3(2, 0x10, 1), F3(~2, ~0x10, ~1),        "1,i,d", 0, v6 },
  806. { "addcc",    F3(2, 0x10, 1), F3(~2, ~0x10, ~1),        "i,1,d", 0, v6 },
  807. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  808.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  809. { "addx",    F3(2, 0x08, 0), F3(~2, ~0x08, ~0)|ASI(~0),    "1,2,d", F_ALIAS, v6 },
  810. { "addx",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "1,i,d", F_ALIAS, v6 },
  811. { "addx",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "i,1,d", F_ALIAS, v6 },
  812. { "addc",    F3(2, 0x08, 0), F3(~2, ~0x08, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  813. { "addc",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "1,i,d", 0, v9 },
  814. { "addc",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "i,1,d", 0, v9 },
  815. /* FIXME These are marked F_ALIAS, so that they won't conflict with new v9
  816.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  817. { "addxcc",    F3(2, 0x18, 0), F3(~2, ~0x18, ~0)|ASI(~0),    "1,2,d", F_ALIAS, v6 },
  818. { "addxcc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "1,i,d", F_ALIAS, v6 },
  819. { "addxcc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "i,1,d", F_ALIAS, v6 },
  820. { "addccc",    F3(2, 0x18, 0), F3(~2, ~0x18, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  821. { "addccc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "1,i,d", 0, v9 },
  822. { "addccc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "i,1,d", 0, v9 },
  823.  
  824. { "smul",    F3(2, 0x0b, 0), F3(~2, ~0x0b, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  825. { "smul",    F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),        "1,i,d", 0, v8 },
  826. { "smul",    F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),        "i,1,d", 0, v8 },
  827. { "smulcc",    F3(2, 0x1b, 0), F3(~2, ~0x1b, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  828. { "smulcc",    F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),        "1,i,d", 0, v8 },
  829. { "smulcc",    F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),        "i,1,d", 0, v8 },
  830. { "umul",    F3(2, 0x0a, 0), F3(~2, ~0x0a, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  831. { "umul",    F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),        "1,i,d", 0, v8 },
  832. { "umul",    F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),        "i,1,d", 0, v8 },
  833. { "umulcc",    F3(2, 0x1a, 0), F3(~2, ~0x1a, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  834. { "umulcc",    F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),        "1,i,d", 0, v8 },
  835. { "umulcc",    F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),        "i,1,d", 0, v8 },
  836. { "sdiv",    F3(2, 0x0f, 0), F3(~2, ~0x0f, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  837. { "sdiv",    F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),        "1,i,d", 0, v8 },
  838. { "sdiv",    F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),        "i,1,d", 0, v8 },
  839. { "sdivcc",    F3(2, 0x1f, 0), F3(~2, ~0x1f, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  840. { "sdivcc",    F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),        "1,i,d", 0, v8 },
  841. { "sdivcc",    F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),        "i,1,d", 0, v8 },
  842. { "udiv",    F3(2, 0x0e, 0), F3(~2, ~0x0e, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  843. { "udiv",    F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),        "1,i,d", 0, v8 },
  844. { "udiv",    F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),        "i,1,d", 0, v8 },
  845. { "udivcc",    F3(2, 0x1e, 0), F3(~2, ~0x1e, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  846. { "udivcc",    F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),        "1,i,d", 0, v8 },
  847. { "udivcc",    F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),        "i,1,d", 0, v8 },
  848.  
  849. { "mulx",    F3(2, 0x09, 0), F3(~2, ~0x09, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  850. { "mulx",    F3(2, 0x09, 1), F3(~2, ~0x09, ~1),        "1,i,d", 0, v9 },
  851. { "sdivx",    F3(2, 0x2d, 0), F3(~2, ~0x2d, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  852. { "sdivx",    F3(2, 0x2d, 1), F3(~2, ~0x2d, ~1),        "1,i,d", 0, v9 },
  853. { "udivx",    F3(2, 0x0d, 0), F3(~2, ~0x0d, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  854. { "udivx",    F3(2, 0x0d, 1), F3(~2, ~0x0d, ~1),        "1,i,d", 0, v9 },
  855.  
  856. { "call",    F1(0x1), F1(~0x1), "L", F_JSR|F_DELAYED, v6 },
  857. { "call",    F1(0x1), F1(~0x1), "L,#", F_JSR|F_DELAYED, v6 },
  858.  
  859. { "call",    F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI(~0),    "1+2", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+rs2,%o7 */
  860. { "call",    F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI(~0),    "1+2,#", F_JSR|F_DELAYED, v6 },
  861. { "call",    F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI_RS2(~0),    "1", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+%g0,%o7 */
  862. { "call",    F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI_RS2(~0),    "1,#", F_JSR|F_DELAYED, v6 },
  863. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "1+i", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+i,%o7 */
  864. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "1+i,#", F_JSR|F_DELAYED, v6 },
  865. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "i+1", F_JSR|F_DELAYED, v6 }, /* jmpl i+rs1,%o7 */
  866. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "i+1,#", F_JSR|F_DELAYED, v6 },
  867. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|RS1_G0,    "i", F_JSR|F_DELAYED, v6 }, /* jmpl %g0+i,%o7 */
  868. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|RS1_G0,    "i,#", F_JSR|F_DELAYED, v6 },
  869. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|SIMM13(~0),    "1", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+0,%o7 */
  870. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|SIMM13(~0),    "1,#", F_JSR|F_DELAYED, v6 },
  871.  
  872.  
  873. /* Conditional instructions.
  874.  
  875.    Because this part of the table was such a mess earlier, I have
  876.    macrofied it so that all the branches and traps are generated from
  877.    a single-line description of each condition value.  John Gilmore. */
  878.  
  879. /* Define branches -- one annulled, one without, etc. */
  880. #define br(opcode, mask, lose, flags) \
  881.  { opcode, (mask)|ANNUL, (lose),       ",a l",   (flags), v6 }, \
  882.  { opcode, (mask)      , (lose)|ANNUL, "l",     (flags), v6 }
  883.  
  884. #define brx(opcode, mask, lose, flags) /* v9 */ \
  885.  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), "Z,G",      (flags), v9 }, \
  886.  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), ",T Z,G",   (flags), v9 }, \
  887.  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a Z,G",   (flags), v9 }, \
  888.  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a,T Z,G", (flags), v9 }, \
  889.  { opcode, (mask)|(2<<20), ANNUL|BPRED|(lose), ",N Z,G",   (flags), v9 }, \
  890.  { opcode, (mask)|(2<<20)|ANNUL, BPRED|(lose), ",a,N Z,G", (flags), v9 }, \
  891.  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), "z,G",      (flags), v9 }, \
  892.  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), ",T z,G",   (flags), v9 }, \
  893.  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a z,G",   (flags), v9 }, \
  894.  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a,T z,G", (flags), v9 }, \
  895.  { opcode, (mask), ANNUL|BPRED|(lose)|(2<<20), ",N z,G",   (flags), v9 }, \
  896.  { opcode, (mask)|ANNUL, BPRED|(lose)|(2<<20), ",a,N z,G", (flags), v9 }
  897.  
  898. /* Define four traps: reg+reg, reg + immediate, immediate alone, reg alone. */
  899. #define tr(opcode, mask, lose, flags) \
  900.  { opcode, (mask)|(2<<11)|IMMED, (lose)|RS1_G0,    "Z,i",   (flags), v9 }, /* %g0 + imm */ \
  901.  { opcode, (mask)|(2<<11)|IMMED, (lose),    "Z,1+i", (flags), v9 }, /* rs1 + imm */ \
  902.  { opcode, (mask)|(2<<11), IMMED|(lose),    "Z,1+2", (flags), v9 }, /* rs1 + rs2 */ \
  903.  { opcode, (mask)|(2<<11), IMMED|(lose)|RS2_G0,    "Z,1",   (flags), v9 }, /* rs1 + %g0 */ \
  904.  { opcode, (mask)|IMMED, (lose)|RS1_G0,    "z,i",   (flags)|F_ALIAS, v9 }, /* %g0 + imm */ \
  905.  { opcode, (mask)|IMMED, (lose),    "z,1+i", (flags)|F_ALIAS, v9 }, /* rs1 + imm */ \
  906.  { opcode, (mask), IMMED|(lose),    "z,1+2", (flags)|F_ALIAS, v9 }, /* rs1 + rs2 */ \
  907.  { opcode, (mask), IMMED|(lose)|RS2_G0,    "z,1",   (flags)|F_ALIAS, v9 }, /* rs1 + %g0 */ \
  908.  { opcode, (mask)|IMMED, (lose)|RS1_G0,        "i",     (flags), v6 }, /* %g0 + imm */ \
  909.  { opcode, (mask)|IMMED, (lose),        "1+i",   (flags), v6 }, /* rs1 + imm */ \
  910.  { opcode, (mask), IMMED|(lose),        "1+2",   (flags), v6 }, /* rs1 + rs2 */ \
  911.  { opcode, (mask), IMMED|(lose)|RS2_G0,        "1",     (flags), v6 } /* rs1 + %g0 */
  912.  
  913. /* v9: We must put `brx' before `br', to ensure that we never match something
  914.    v9: against an expression unless it is an expression.  Otherwise, we end
  915.    v9: up with undefined symbol tables entries, because they get added, but
  916.    v9: are not deleted if the pattern fails to match.  */
  917.  
  918. /* Define both branches and traps based on condition mask */
  919. #define cond(bop, top, mask, flags) \
  920.   brx(bop, F2(0, 1)|(mask), F2(~0, ~1)|((~mask)&COND(~0)), F_DELAYED|(flags)), /* v9 */ \
  921.   br(bop,  F2(0, 2)|(mask), F2(~0, ~2)|((~mask)&COND(~0)), F_DELAYED|(flags)), \
  922.   tr(top,  F3(2, 0x3a, 0)|(mask), F3(~2, ~0x3a, 0)|((~mask)&COND(~0)), ((flags) & ~(F_UNBR|F_CONDBR)))
  923.  
  924. /* Define all the conditions, all the branches, all the traps.  */
  925.  
  926. /* Standard branch, trap mnemonics */
  927. cond ("b",    "ta",   CONDA, F_UNBR),
  928. /* Alternative form (just for assembly, not for disassembly) */
  929. cond ("ba",    "t",    CONDA, F_UNBR|F_ALIAS),
  930.  
  931. cond ("bcc",    "tcc",  CONDCC, F_CONDBR),
  932. cond ("bcs",    "tcs",  CONDCS, F_CONDBR),
  933. cond ("be",    "te",   CONDE, F_CONDBR),
  934. cond ("bg",    "tg",   CONDG, F_CONDBR),
  935. cond ("bgt",    "tgt",   CONDG, F_CONDBR|F_ALIAS),
  936. cond ("bge",    "tge",  CONDGE, F_CONDBR),
  937. cond ("bgeu",    "tgeu", CONDGEU, F_CONDBR|F_ALIAS), /* for cc */
  938. cond ("bgu",    "tgu",  CONDGU, F_CONDBR),
  939. cond ("bl",    "tl",   CONDL, F_CONDBR),
  940. cond ("blt",    "tlt",   CONDL, F_CONDBR|F_ALIAS),
  941. cond ("ble",    "tle",  CONDLE, F_CONDBR),
  942. cond ("bleu",    "tleu", CONDLEU, F_CONDBR),
  943. cond ("blu",    "tlu",  CONDLU, F_CONDBR|F_ALIAS), /* for cs */
  944. cond ("bn",    "tn",   CONDN, F_CONDBR),
  945. cond ("bne",    "tne",  CONDNE, F_CONDBR),
  946. cond ("bneg",    "tneg", CONDNEG, F_CONDBR),
  947. cond ("bnz",    "tnz",  CONDNZ, F_CONDBR|F_ALIAS), /* for ne */
  948. cond ("bpos",    "tpos", CONDPOS, F_CONDBR),
  949. cond ("bvc",    "tvc",  CONDVC, F_CONDBR),
  950. cond ("bvs",    "tvs",  CONDVS, F_CONDBR),
  951. cond ("bz",    "tz",   CONDZ, F_CONDBR|F_ALIAS), /* for e */
  952.  
  953. #undef cond
  954. #undef br
  955. #undef brr /* v9 */
  956. #undef tr
  957.  
  958. #define brr(opcode, mask, lose, flags) /* v9 */ \
  959.  { opcode, (mask)|BPRED, ANNUL|(lose), "1,k",      F_DELAYED|(flags), v9 }, \
  960.  { opcode, (mask)|BPRED, ANNUL|(lose), ",T 1,k",   F_DELAYED|(flags), v9 }, \
  961.  { opcode, (mask)|BPRED|ANNUL, (lose), ",a 1,k",   F_DELAYED|(flags), v9 }, \
  962.  { opcode, (mask)|BPRED|ANNUL, (lose), ",a,T 1,k", F_DELAYED|(flags), v9 }, \
  963.  { opcode, (mask), ANNUL|BPRED|(lose), ",N 1,k",   F_DELAYED|(flags), v9 }, \
  964.  { opcode, (mask)|ANNUL, BPRED|(lose), ",a,N 1,k", F_DELAYED|(flags), v9 }
  965.  
  966. #define condr(bop, mask, flags) /* v9 */ \
  967.   brr(bop, F2(0, 3)|COND(mask), F2(~0, ~3)|COND(~(mask)), (flags)) /* v9 */
  968.  
  969. /* v9 */ condr("brnz", 0x5, F_CONDBR),
  970. /* v9 */ condr("brz", 0x1, F_CONDBR),
  971. /* v9 */ condr("brgez", 0x7, F_CONDBR),
  972. /* v9 */ condr("brlz", 0x3, F_CONDBR),
  973. /* v9 */ condr("brlez", 0x2, F_CONDBR),
  974. /* v9 */ condr("brgz", 0x6, F_CONDBR),
  975.  
  976. #undef condr /* v9 */
  977. #undef brr /* v9 */
  978.  
  979. #define movr(opcode, mask, flags) /* v9 */ \
  980.  { opcode, F3(2, 0x2f, 0)|RCOND(mask), F3(~2, ~0x2f, ~0)|RCOND(~(mask)), "1,2,d", (flags), v9 }, \
  981.  { opcode, F3(2, 0x2f, 1)|RCOND(mask), F3(~2, ~0x2f, ~1)|RCOND(~(mask)), "1,j,d", (flags), v9 }
  982.  
  983. #define fmrrs(opcode, mask, lose, flags) /* v9 */ \
  984.  { opcode, (mask), (lose), "1,f,g", (flags), v9 }
  985. #define fmrrd(opcode, mask, lose, flags) /* v9 */ \
  986.  { opcode, (mask), (lose), "1,B,H", (flags), v9 }
  987. #define fmrrq(opcode, mask, lose, flags) /* v9 */ \
  988.  { opcode, (mask), (lose), "1,R,J", (flags), v9 }
  989.  
  990. #define fmovrs(mop, mask, flags) /* v9 */ \
  991.   fmrrs(mop, F3(2, 0x35, 0)|OPF_LOW5(5)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~5)|RCOND(~(mask)), (flags)) /* v9 */
  992. #define fmovrd(mop, mask, flags) /* v9 */ \
  993.   fmrrd(mop, F3(2, 0x35, 0)|OPF_LOW5(6)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~6)|RCOND(~(mask)), (flags)) /* v9 */
  994. #define fmovrq(mop, mask, flags) /* v9 */ \
  995.   fmrrq(mop, F3(2, 0x35, 0)|OPF_LOW5(7)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~7)|RCOND(~(mask)), (flags)) /* v9 */
  996.  
  997. /* v9 */ movr("movrne", 0x5, 0),
  998. /* v9 */ movr("movre", 0x1, 0),
  999. /* v9 */ movr("movrgez", 0x7, 0),
  1000. /* v9 */ movr("movrlz", 0x3, 0),
  1001. /* v9 */ movr("movrlez", 0x2, 0),
  1002. /* v9 */ movr("movrgz", 0x6, 0),
  1003. /* v9 */ movr("movrnz", 0x5, F_ALIAS),
  1004. /* v9 */ movr("movrz", 0x1, F_ALIAS),
  1005.  
  1006. /* v9 */ fmovrs("fmovrsne", 0x5, 0),
  1007. /* v9 */ fmovrs("fmovrse", 0x1, 0),
  1008. /* v9 */ fmovrs("fmovrsgez", 0x7, 0),
  1009. /* v9 */ fmovrs("fmovrslz", 0x3, 0),
  1010. /* v9 */ fmovrs("fmovrslez", 0x2, 0),
  1011. /* v9 */ fmovrs("fmovrsgz", 0x6, 0),
  1012. /* v9 */ fmovrs("fmovrsnz", 0x5, F_ALIAS),
  1013. /* v9 */ fmovrs("fmovrsz", 0x1, F_ALIAS),
  1014.  
  1015. /* v9 */ fmovrd("fmovrdne", 0x5, 0),
  1016. /* v9 */ fmovrd("fmovrde", 0x1, 0),
  1017. /* v9 */ fmovrd("fmovrdgez", 0x7, 0),
  1018. /* v9 */ fmovrd("fmovrdlz", 0x3, 0),
  1019. /* v9 */ fmovrd("fmovrdlez", 0x2, 0),
  1020. /* v9 */ fmovrd("fmovrdgz", 0x6, 0),
  1021. /* v9 */ fmovrd("fmovrdnz", 0x5, F_ALIAS),
  1022. /* v9 */ fmovrd("fmovrdz", 0x1, F_ALIAS),
  1023.  
  1024. /* v9 */ fmovrq("fmovrqne", 0x5, 0),
  1025. /* v9 */ fmovrq("fmovrqe", 0x1, 0),
  1026. /* v9 */ fmovrq("fmovrqgez", 0x7, 0),
  1027. /* v9 */ fmovrq("fmovrqlz", 0x3, 0),
  1028. /* v9 */ fmovrq("fmovrqlez", 0x2, 0),
  1029. /* v9 */ fmovrq("fmovrqgz", 0x6, 0),
  1030. /* v9 */ fmovrq("fmovrqnz", 0x5, F_ALIAS),
  1031. /* v9 */ fmovrq("fmovrqz", 0x1, F_ALIAS),
  1032.  
  1033. #undef movr /* v9 */
  1034. #undef fmovr /* v9 */
  1035. #undef fmrr /* v9 */
  1036.  
  1037. #define movicc(opcode, cond, flags) /* v9 */ \
  1038.   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|XCC|(1<<11), "z,2,d", flags, v9 }, \
  1039.   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|XCC|(1<<11), "z,I,d", flags, v9 }, \
  1040.   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|(1<<11),     "Z,2,d", flags, v9 }, \
  1041.   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|(1<<11),     "Z,I,d", flags, v9 }
  1042.  
  1043. #define movfcc(opcode, fcond, flags) /* v9 */ \
  1044.   { opcode, F3(2, 0x2c, 0)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~0), "6,2,d", flags, v9 }, \
  1045.   { opcode, F3(2, 0x2c, 1)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~1), "6,I,d", flags, v9 }, \
  1046.   { opcode, F3(2, 0x2c, 0)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~0), "7,2,d", flags, v9 }, \
  1047.   { opcode, F3(2, 0x2c, 1)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~1), "7,I,d", flags, v9 }, \
  1048.   { opcode, F3(2, 0x2c, 0)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~0), "8,2,d", flags, v9 }, \
  1049.   { opcode, F3(2, 0x2c, 1)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~1), "8,I,d", flags, v9 }, \
  1050.   { opcode, F3(2, 0x2c, 0)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~0), "9,2,d", flags, v9 }, \
  1051.   { opcode, F3(2, 0x2c, 1)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~1), "9,I,d", flags, v9 }
  1052.  
  1053. #define movcc(opcode, cond, fcond, flags) /* v9 */ \
  1054.   movfcc (opcode, fcond, flags), /* v9 */ \
  1055.   movicc (opcode, cond, flags) /* v9 */
  1056.  
  1057. /* v9 */ movcc  ("mova",    CONDA, FCONDA, 0),
  1058. /* v9 */ movicc ("movcc",    CONDCC, 0),
  1059. /* v9 */ movicc ("movgeu",    CONDGEU, F_ALIAS),
  1060. /* v9 */ movicc ("movcs",    CONDCS, 0),
  1061. /* v9 */ movicc ("movlu",    CONDLU, F_ALIAS),
  1062. /* v9 */ movcc  ("move",    CONDE, FCONDE, 0),
  1063. /* v9 */ movcc  ("movg",    CONDG, FCONDG, 0),
  1064. /* v9 */ movcc  ("movge",    CONDGE, FCONDGE, 0),
  1065. /* v9 */ movicc ("movgu",    CONDGU, 0),
  1066. /* v9 */ movcc  ("movl",    CONDL, FCONDL, 0),
  1067. /* v9 */ movcc  ("movle",    CONDLE, FCONDLE, 0),
  1068. /* v9 */ movicc ("movleu",    CONDLEU, 0),
  1069. /* v9 */ movfcc ("movlg",    FCONDLG, 0),
  1070. /* v9 */ movcc  ("movn",    CONDN, FCONDN, 0),
  1071. /* v9 */ movcc  ("movne",    CONDNE, FCONDNE, 0),
  1072. /* v9 */ movicc ("movneg",    CONDNEG, 0),
  1073. /* v9 */ movcc  ("movnz",    CONDNZ, FCONDNZ, F_ALIAS),
  1074. /* v9 */ movfcc ("movo",    FCONDO, 0),
  1075. /* v9 */ movicc ("movpos",    CONDPOS, 0),
  1076. /* v9 */ movfcc ("movu",    FCONDU, 0),
  1077. /* v9 */ movfcc ("movue",    FCONDUE, 0),
  1078. /* v9 */ movfcc ("movug",    FCONDUG, 0),
  1079. /* v9 */ movfcc ("movuge",    FCONDUGE, 0),
  1080. /* v9 */ movfcc ("movul",    FCONDUL, 0),
  1081. /* v9 */ movfcc ("movule",    FCONDULE, 0),
  1082. /* v9 */ movicc ("movvc",    CONDVC, 0),
  1083. /* v9 */ movicc ("movvs",    CONDVS, 0),
  1084. /* v9 */ movcc  ("movz",    CONDZ, FCONDZ, F_ALIAS),
  1085.  
  1086. #undef movicc /* v9 */
  1087. #undef movfcc /* v9 */
  1088. #undef movcc /* v9 */
  1089.  
  1090. #define FM_SF 1        /* v9 - values for fpsize */
  1091. #define FM_DF 2        /* v9 */
  1092. #define FM_QF 3        /* v9 */
  1093.  
  1094. #define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \
  1095. { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags, v9 }, \
  1096. { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags, v9 }
  1097.  
  1098. #define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \
  1099. { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \
  1100. { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \
  1101. { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \
  1102. { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 }
  1103.  
  1104. /* FIXME: use fmovicc/fmovfcc? */ /* v9 */
  1105. #define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \
  1106. { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags, v9 }, \
  1107. { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \
  1108. { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags, v9 }, \
  1109. { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \
  1110. { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \
  1111. { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 }
  1112.  
  1113. /* v9 */ fmovcc  ("fmovda",    FM_DF, CONDA, FCONDA, 0),
  1114. /* v9 */ fmovcc  ("fmovqa",    FM_QF, CONDA, FCONDA, 0),
  1115. /* v9 */ fmovcc  ("fmovsa",    FM_SF, CONDA, FCONDA, 0),
  1116. /* v9 */ fmovicc ("fmovdcc",    FM_DF, CONDCC, 0),
  1117. /* v9 */ fmovicc ("fmovqcc",    FM_QF, CONDCC, 0),
  1118. /* v9 */ fmovicc ("fmovscc",    FM_SF, CONDCC, 0),
  1119. /* v9 */ fmovicc ("fmovdcs",    FM_DF, CONDCS, 0),
  1120. /* v9 */ fmovicc ("fmovqcs",    FM_QF, CONDCS, 0),
  1121. /* v9 */ fmovicc ("fmovscs",    FM_SF, CONDCS, 0),
  1122. /* v9 */ fmovcc  ("fmovde",    FM_DF, CONDE, FCONDE, 0),
  1123. /* v9 */ fmovcc  ("fmovqe",    FM_QF, CONDE, FCONDE, 0),
  1124. /* v9 */ fmovcc  ("fmovse",    FM_SF, CONDE, FCONDE, 0),
  1125. /* v9 */ fmovcc  ("fmovdg",    FM_DF, CONDG, FCONDG, 0),
  1126. /* v9 */ fmovcc  ("fmovqg",    FM_QF, CONDG, FCONDG, 0),
  1127. /* v9 */ fmovcc  ("fmovsg",    FM_SF, CONDG, FCONDG, 0),
  1128. /* v9 */ fmovcc  ("fmovdge",    FM_DF, CONDGE, FCONDGE, 0),
  1129. /* v9 */ fmovcc  ("fmovqge",    FM_QF, CONDGE, FCONDGE, 0),
  1130. /* v9 */ fmovcc  ("fmovsge",    FM_SF, CONDGE, FCONDGE, 0),
  1131. /* v9 */ fmovicc ("fmovdgeu",    FM_DF, CONDGEU, F_ALIAS),
  1132. /* v9 */ fmovicc ("fmovqgeu",    FM_QF, CONDGEU, F_ALIAS),
  1133. /* v9 */ fmovicc ("fmovsgeu",    FM_SF, CONDGEU, F_ALIAS),
  1134. /* v9 */ fmovicc ("fmovdgu",    FM_DF, CONDGU, 0),
  1135. /* v9 */ fmovicc ("fmovqgu",    FM_QF, CONDGU, 0),
  1136. /* v9 */ fmovicc ("fmovsgu",    FM_SF, CONDGU, 0),
  1137. /* v9 */ fmovcc  ("fmovdl",    FM_DF, CONDL, FCONDL, 0),
  1138. /* v9 */ fmovcc  ("fmovql",    FM_QF, CONDL, FCONDL, 0),
  1139. /* v9 */ fmovcc  ("fmovsl",    FM_SF, CONDL, FCONDL, 0),
  1140. /* v9 */ fmovcc  ("fmovdle",    FM_DF, CONDLE, FCONDLE, 0),
  1141. /* v9 */ fmovcc  ("fmovqle",    FM_QF, CONDLE, FCONDLE, 0),
  1142. /* v9 */ fmovcc  ("fmovsle",    FM_SF, CONDLE, FCONDLE, 0),
  1143. /* v9 */ fmovicc ("fmovdleu",    FM_DF, CONDLEU, 0),
  1144. /* v9 */ fmovicc ("fmovqleu",    FM_QF, CONDLEU, 0),
  1145. /* v9 */ fmovicc ("fmovsleu",    FM_SF, CONDLEU, 0),
  1146. /* v9 */ fmovfcc ("fmovdlg",    FM_DF, FCONDLG, 0),
  1147. /* v9 */ fmovfcc ("fmovqlg",    FM_QF, FCONDLG, 0),
  1148. /* v9 */ fmovfcc ("fmovslg",    FM_SF, FCONDLG, 0),
  1149. /* v9 */ fmovicc ("fmovdlu",    FM_DF, CONDLU, F_ALIAS),
  1150. /* v9 */ fmovicc ("fmovqlu",    FM_QF, CONDLU, F_ALIAS),
  1151. /* v9 */ fmovicc ("fmovslu",    FM_SF, CONDLU, F_ALIAS),
  1152. /* v9 */ fmovcc  ("fmovdn",    FM_DF, CONDN, FCONDN, 0),
  1153. /* v9 */ fmovcc  ("fmovqn",    FM_QF, CONDN, FCONDN, 0),
  1154. /* v9 */ fmovcc  ("fmovsn",    FM_SF, CONDN, FCONDN, 0),
  1155. /* v9 */ fmovcc  ("fmovdne",    FM_DF, CONDNE, FCONDNE, 0),
  1156. /* v9 */ fmovcc  ("fmovqne",    FM_QF, CONDNE, FCONDNE, 0),
  1157. /* v9 */ fmovcc  ("fmovsne",    FM_SF, CONDNE, FCONDNE, 0),
  1158. /* v9 */ fmovicc ("fmovdneg",    FM_DF, CONDNEG, 0),
  1159. /* v9 */ fmovicc ("fmovqneg",    FM_QF, CONDNEG, 0),
  1160. /* v9 */ fmovicc ("fmovsneg",    FM_SF, CONDNEG, 0),
  1161. /* v9 */ fmovcc  ("fmovdnz",    FM_DF, CONDNZ, FCONDNZ, F_ALIAS),
  1162. /* v9 */ fmovcc  ("fmovqnz",    FM_QF, CONDNZ, FCONDNZ, F_ALIAS),
  1163. /* v9 */ fmovcc  ("fmovsnz",    FM_SF, CONDNZ, FCONDNZ, F_ALIAS),
  1164. /* v9 */ fmovfcc ("fmovdo",    FM_DF, FCONDO, 0),
  1165. /* v9 */ fmovfcc ("fmovqo",    FM_QF, FCONDO, 0),
  1166. /* v9 */ fmovfcc ("fmovso",    FM_SF, FCONDO, 0),
  1167. /* v9 */ fmovicc ("fmovdpos",    FM_DF, CONDPOS, 0),
  1168. /* v9 */ fmovicc ("fmovqpos",    FM_QF, CONDPOS, 0),
  1169. /* v9 */ fmovicc ("fmovspos",    FM_SF, CONDPOS, 0),
  1170. /* v9 */ fmovfcc ("fmovdu",    FM_DF, FCONDU, 0),
  1171. /* v9 */ fmovfcc ("fmovqu",    FM_QF, FCONDU, 0),
  1172. /* v9 */ fmovfcc ("fmovsu",    FM_SF, FCONDU, 0),
  1173. /* v9 */ fmovfcc ("fmovdue",    FM_DF, FCONDUE, 0),
  1174. /* v9 */ fmovfcc ("fmovque",    FM_QF, FCONDUE, 0),
  1175. /* v9 */ fmovfcc ("fmovsue",    FM_SF, FCONDUE, 0),
  1176. /* v9 */ fmovfcc ("fmovdug",    FM_DF, FCONDUG, 0),
  1177. /* v9 */ fmovfcc ("fmovqug",    FM_QF, FCONDUG, 0),
  1178. /* v9 */ fmovfcc ("fmovsug",    FM_SF, FCONDUG, 0),
  1179. /* v9 */ fmovfcc ("fmovduge",    FM_DF, FCONDUGE, 0),
  1180. /* v9 */ fmovfcc ("fmovquge",    FM_QF, FCONDUGE, 0),
  1181. /* v9 */ fmovfcc ("fmovsuge",    FM_SF, FCONDUGE, 0),
  1182. /* v9 */ fmovfcc ("fmovdul",    FM_DF, FCONDUL, 0),
  1183. /* v9 */ fmovfcc ("fmovqul",    FM_QF, FCONDUL, 0),
  1184. /* v9 */ fmovfcc ("fmovsul",    FM_SF, FCONDUL, 0),
  1185. /* v9 */ fmovfcc ("fmovdule",    FM_DF, FCONDULE, 0),
  1186. /* v9 */ fmovfcc ("fmovqule",    FM_QF, FCONDULE, 0),
  1187. /* v9 */ fmovfcc ("fmovsule",    FM_SF, FCONDULE, 0),
  1188. /* v9 */ fmovicc ("fmovdvc",    FM_DF, CONDVC, 0),
  1189. /* v9 */ fmovicc ("fmovqvc",    FM_QF, CONDVC, 0),
  1190. /* v9 */ fmovicc ("fmovsvc",    FM_SF, CONDVC, 0),
  1191. /* v9 */ fmovicc ("fmovdvs",    FM_DF, CONDVS, 0),
  1192. /* v9 */ fmovicc ("fmovqvs",    FM_QF, CONDVS, 0),
  1193. /* v9 */ fmovicc ("fmovsvs",    FM_SF, CONDVS, 0),
  1194. /* v9 */ fmovcc  ("fmovdz",    FM_DF, CONDZ, FCONDZ, F_ALIAS),
  1195. /* v9 */ fmovcc  ("fmovqz",    FM_QF, CONDZ, FCONDZ, F_ALIAS),
  1196. /* v9 */ fmovcc  ("fmovsz",    FM_SF, CONDZ, FCONDZ, F_ALIAS),
  1197.  
  1198. #undef fmovicc /* v9 */
  1199. #undef fmovfcc /* v9 */
  1200. #undef fmovcc /* v9 */
  1201. #undef FM_DF /* v9 */
  1202. #undef FM_QF /* v9 */
  1203. #undef FM_SF /* v9 */
  1204.  
  1205. #define brfc(opcode, mask, lose, flags) \
  1206.  { opcode, (mask), ANNUL|(lose), "l",    flags|F_DELAYED, v6 }, \
  1207.  { opcode, (mask)|ANNUL, (lose), ",a l", flags|F_DELAYED, v6 }
  1208.  
  1209. #define brfcx(opcode, mask, lose, flags) /* v9 */ \
  1210.  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), "6,G",      flags|F_DELAYED, v9 }, \
  1211.  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), ",T 6,G",   flags|F_DELAYED, v9 }, \
  1212.  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a 6,G",   flags|F_DELAYED, v9 }, \
  1213.  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a,T 6,G", flags|F_DELAYED, v9 }, \
  1214.  { opcode, FBFCC(0)|(mask), ANNUL|BPRED|FBFCC(~0)|(lose), ",N 6,G",   flags|F_DELAYED, v9 }, \
  1215.  { opcode, FBFCC(0)|(mask)|ANNUL, BPRED|FBFCC(~0)|(lose), ",a,N 6,G", flags|F_DELAYED, v9 }, \
  1216.  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), "7,G",      flags|F_DELAYED, v9 }, \
  1217.  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), ",T 7,G",   flags|F_DELAYED, v9 }, \
  1218.  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a 7,G",   flags|F_DELAYED, v9 }, \
  1219.  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a,T 7,G", flags|F_DELAYED, v9 }, \
  1220.  { opcode, FBFCC(1)|(mask), ANNUL|BPRED|FBFCC(~1)|(lose), ",N 7,G",   flags|F_DELAYED, v9 }, \
  1221.  { opcode, FBFCC(1)|(mask)|ANNUL, BPRED|FBFCC(~1)|(lose), ",a,N 7,G", flags|F_DELAYED, v9 }, \
  1222.  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), "8,G",      flags|F_DELAYED, v9 }, \
  1223.  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), ",T 8,G",   flags|F_DELAYED, v9 }, \
  1224.  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a 8,G",   flags|F_DELAYED, v9 }, \
  1225.  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a,T 8,G", flags|F_DELAYED, v9 }, \
  1226.  { opcode, FBFCC(2)|(mask), ANNUL|BPRED|FBFCC(~2)|(lose), ",N 8,G",   flags|F_DELAYED, v9 }, \
  1227.  { opcode, FBFCC(2)|(mask)|ANNUL, BPRED|FBFCC(~2)|(lose), ",a,N 8,G", flags|F_DELAYED, v9 }, \
  1228.  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), "9,G",      flags|F_DELAYED, v9 }, \
  1229.  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), ",T 9,G",   flags|F_DELAYED, v9 }, \
  1230.  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a 9,G",   flags|F_DELAYED, v9 }, \
  1231.  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a,T 9,G", flags|F_DELAYED, v9 }, \
  1232.  { opcode, FBFCC(3)|(mask), ANNUL|BPRED|FBFCC(~3)|(lose), ",N 9,G",   flags|F_DELAYED, v9 }, \
  1233.  { opcode, FBFCC(3)|(mask)|ANNUL, BPRED|FBFCC(~3)|(lose), ",a,N  9,G", flags|F_DELAYED, v9 }
  1234.  
  1235. /* v9: We must put `brfcx' before `brfc', to ensure that we never match
  1236.    v9: something against an expression unless it is an expression.  Otherwise,
  1237.    v9: we end up with undefined symbol tables entries, because they get added,
  1238.    v9: but are not deleted if the pattern fails to match.  */
  1239.  
  1240. #define condfc(fop, cop, mask, flags) \
  1241.   brfcx(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
  1242.   brfc(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags), \
  1243.   brfc(cop, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)), flags)
  1244.  
  1245. #define condf(fop, mask, flags) \
  1246.   brfcx(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
  1247.   brfc(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags)
  1248.  
  1249. condfc("fb",    "cb",     0x8, 0),
  1250. condfc("fba",    "cba",     0x8, F_ALIAS),
  1251. condfc("fbe",    "cb0",     0x9, 0),
  1252. condf("fbz",         0x9, F_ALIAS),
  1253. condfc("fbg",    "cb2",     0x6, 0),
  1254. condfc("fbge",    "cb02",     0xb, 0),
  1255. condfc("fbl",    "cb1",     0x4, 0),
  1256. condfc("fble",    "cb01",     0xd, 0),
  1257. condfc("fblg",    "cb12",     0x2, 0),
  1258. condfc("fbn",    "cbn",     0x0, 0),
  1259. condfc("fbne",    "cb123", 0x1, 0),
  1260. condf("fbnz",         0x1, F_ALIAS),
  1261. condfc("fbo",    "cb012", 0xf, 0),
  1262. condfc("fbu",    "cb3",     0x7, 0),
  1263. condfc("fbue",    "cb03",     0xa, 0),
  1264. condfc("fbug",    "cb23",     0x5, 0),
  1265. condfc("fbuge",    "cb023", 0xc, 0),
  1266. condfc("fbul",    "cb13",     0x3, 0),
  1267. condfc("fbule",    "cb013", 0xe, 0),
  1268.  
  1269. #undef condfc
  1270. #undef brfc
  1271. #undef brfcx    /* v9 */
  1272.  
  1273. { "jmp",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI(~0),    "1+2", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+rs2,%g0 */
  1274. { "jmp",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+%g0,%g0 */
  1275. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,        "1+i", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+i,%g0 */
  1276. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,        "i+1", F_UNBR|F_DELAYED, v6 }, /* jmpl i+rs1,%g0 */
  1277. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|RS1_G0,        "i", F_UNBR|F_DELAYED, v6 }, /* jmpl %g0+i,%g0 */
  1278. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|SIMM13(~0),    "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+0,%g0 */
  1279.  
  1280. { "nop",    F2(0, 4), 0xfeffffff, "", 0, v6 }, /* sethi 0, %g0 */
  1281.  
  1282. { "set",    F2(0x0, 0x4), F2(~0x0, ~0x4), "Sh,d", F_ALIAS, v6 },
  1283.  
  1284. { "sethi",    F2(0x0, 0x4), F2(~0x0, ~0x4), "h,d", 0, v6 },
  1285.  
  1286. { "taddcc",    F3(2, 0x20, 0), F3(~2, ~0x20, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1287. { "taddcc",    F3(2, 0x20, 1), F3(~2, ~0x20, ~1),        "1,i,d", 0, v6 },
  1288. { "taddcc",    F3(2, 0x20, 1), F3(~2, ~0x20, ~1),        "i,1,d", 0, v6 },
  1289. { "taddcctv",    F3(2, 0x22, 0), F3(~2, ~0x22, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1290. { "taddcctv",    F3(2, 0x22, 1), F3(~2, ~0x22, ~1),        "1,i,d", 0, v6 },
  1291. { "taddcctv",    F3(2, 0x22, 1), F3(~2, ~0x22, ~1),        "i,1,d", 0, v6 },
  1292.  
  1293. { "tsubcc",    F3(2, 0x21, 0), F3(~2, ~0x21, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1294. { "tsubcc",    F3(2, 0x21, 1), F3(~2, ~0x21, ~1),        "1,i,d", 0, v6 },
  1295. { "tsubcctv",    F3(2, 0x23, 0), F3(~2, ~0x23, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1296. { "tsubcctv",    F3(2, 0x23, 1), F3(~2, ~0x23, ~1),        "1,i,d", 0, v6 },
  1297.  
  1298. /* FIXME This is marked F_ALIAS, so that it won't conflict with new v9
  1299.    insns when v9 is present.  Otherwise, the F_ALIAS flag is ignored.  */
  1300. { "unimp",    F2(0x0, 0x0), 0xffc00000, "n", F_ALIAS, v6 },
  1301. { "illtrap",    F2(0, 0), F2(~0, ~0)|RD_G0, "n", 0, v9 },
  1302.  
  1303. /* This *is* a commutative instruction.  */
  1304. { "xnor",    F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1305. { "xnor",    F3(2, 0x07, 1), F3(~2, ~0x07, ~1),        "1,i,d", 0, v6 },
  1306. { "xnor",    F3(2, 0x07, 1), F3(~2, ~0x07, ~1),        "i,1,d", 0, v6 },
  1307. /* This *is* a commutative instruction.  */
  1308. { "xnorcc",    F3(2, 0x17, 0), F3(~2, ~0x17, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1309. { "xnorcc",    F3(2, 0x17, 1), F3(~2, ~0x17, ~1),        "1,i,d", 0, v6 },
  1310. { "xnorcc",    F3(2, 0x17, 1), F3(~2, ~0x17, ~1),        "i,1,d", 0, v6 },
  1311. { "xor",    F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1312. { "xor",    F3(2, 0x03, 1), F3(~2, ~0x03, ~1),        "1,i,d", 0, v6 },
  1313. { "xor",    F3(2, 0x03, 1), F3(~2, ~0x03, ~1),        "i,1,d", 0, v6 },
  1314. { "xorcc",    F3(2, 0x13, 0), F3(~2, ~0x13, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1315. { "xorcc",    F3(2, 0x13, 1), F3(~2, ~0x13, ~1),        "1,i,d", 0, v6 },
  1316. { "xorcc",    F3(2, 0x13, 1), F3(~2, ~0x13, ~1),        "i,1,d", 0, v6 },
  1317.  
  1318. { "not",    F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "1,d", F_ALIAS, v6 }, /* xnor rs1,%0,rd */
  1319. { "not",    F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "r", F_ALIAS, v6 }, /* xnor rd,%0,rd */
  1320.  
  1321. { "btog",    F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),    "2,r", F_ALIAS, v6 }, /* xor rd,rs2,rd */
  1322. { "btog",    F3(2, 0x03, 1), F3(~2, ~0x03, ~1),        "i,r", F_ALIAS, v6 }, /* xor rd,i,rd */
  1323.  
  1324. /* FPop1 and FPop2 are not instructions.  Don't accept them.  */
  1325.  
  1326. { "fdtoi",    F3F(2, 0x34, 0x0d2), F3F(~2, ~0x34, ~0x0d2)|RS1_G0, "B,g", 0, v6 },
  1327. { "fstoi",    F3F(2, 0x34, 0x0d1), F3F(~2, ~0x34, ~0x0d1)|RS1_G0, "f,g", 0, v6 },
  1328. { "fqtoi",    F3F(2, 0x34, 0x0d3), F3F(~2, ~0x34, ~0x0d3)|RS1_G0, "R,g", 0, v8 },
  1329.  
  1330. { "fdtox",    F3F(2, 0x34, 0x082), F3F(~2, ~0x34, ~0x082)|RS1_G0, "B,g", 0, v9 },
  1331. { "fstox",    F3F(2, 0x34, 0x081), F3F(~2, ~0x34, ~0x081)|RS1_G0, "f,g", 0, v9 },
  1332. { "fqtox",    F3F(2, 0x34, 0x083), F3F(~2, ~0x34, ~0x083)|RS1_G0, "R,g", 0, v9 },
  1333.  
  1334. { "fitod",    F3F(2, 0x34, 0x0c8), F3F(~2, ~0x34, ~0x0c8)|RS1_G0, "f,H", 0, v6 },
  1335. { "fitos",    F3F(2, 0x34, 0x0c4), F3F(~2, ~0x34, ~0x0c4)|RS1_G0, "f,g", 0, v6 },
  1336. { "fitoq",    F3F(2, 0x34, 0x0cc), F3F(~2, ~0x34, ~0x0cc)|RS1_G0, "f,J", 0, v8 },
  1337.  
  1338. { "fxtod",    F3F(2, 0x34, 0x088), F3F(~2, ~0x34, ~0x088)|RS1_G0, "f,H", 0, v9 },
  1339. { "fxtos",    F3F(2, 0x34, 0x084), F3F(~2, ~0x34, ~0x084)|RS1_G0, "f,g", 0, v9 },
  1340. { "fxtoq",    F3F(2, 0x34, 0x08c), F3F(~2, ~0x34, ~0x08c)|RS1_G0, "f,J", 0, v9 },
  1341.  
  1342. { "fdtoq",    F3F(2, 0x34, 0x0ce), F3F(~2, ~0x34, ~0x0ce)|RS1_G0, "B,J", 0, v8 },
  1343. { "fdtos",    F3F(2, 0x34, 0x0c6), F3F(~2, ~0x34, ~0x0c6)|RS1_G0, "B,g", 0, v6 },
  1344. { "fqtod",    F3F(2, 0x34, 0x0cb), F3F(~2, ~0x34, ~0x0cb)|RS1_G0, "R,H", 0, v8 },
  1345. { "fqtos",    F3F(2, 0x34, 0x0c7), F3F(~2, ~0x34, ~0x0c7)|RS1_G0, "R,g", 0, v8 },
  1346. { "fstod",    F3F(2, 0x34, 0x0c9), F3F(~2, ~0x34, ~0x0c9)|RS1_G0, "f,H", 0, v6 },
  1347. { "fstoq",    F3F(2, 0x34, 0x0cd), F3F(~2, ~0x34, ~0x0cd)|RS1_G0, "f,J", 0, v8 },
  1348.  
  1349. { "fdivd",    F3F(2, 0x34, 0x04e), F3F(~2, ~0x34, ~0x04e), "v,B,H", 0, v6 },
  1350. { "fdivq",    F3F(2, 0x34, 0x04f), F3F(~2, ~0x34, ~0x04f), "V,R,J", 0, v8 },
  1351. { "fdivs",    F3F(2, 0x34, 0x04d), F3F(~2, ~0x34, ~0x04d), "e,f,g", 0, v6 },
  1352. { "fmuld",    F3F(2, 0x34, 0x04a), F3F(~2, ~0x34, ~0x04a), "v,B,H", 0, v6 },
  1353. { "fmulq",    F3F(2, 0x34, 0x04b), F3F(~2, ~0x34, ~0x04b), "V,R,J", 0, v8 },
  1354. { "fmuls",    F3F(2, 0x34, 0x049), F3F(~2, ~0x34, ~0x049), "e,f,g", 0, v6 },
  1355.  
  1356. { "fdmulq",    F3F(2, 0x34, 0x06e), F3F(~2, ~0x34, ~0x06e), "v,B,J", 0, v8 },
  1357. { "fsmuld",    F3F(2, 0x34, 0x069), F3F(~2, ~0x34, ~0x069), "e,f,H", 0, v8 },
  1358.  
  1359. { "fsqrtd",    F3F(2, 0x34, 0x02a), F3F(~2, ~0x34, ~0x02a)|RS1_G0, "B,H", 0, v7 },
  1360. { "fsqrtq",    F3F(2, 0x34, 0x02b), F3F(~2, ~0x34, ~0x02b)|RS1_G0, "R,J", 0, v8 },
  1361. { "fsqrts",    F3F(2, 0x34, 0x029), F3F(~2, ~0x34, ~0x029)|RS1_G0, "f,g", 0, v7 },
  1362.  
  1363. { "fabsd",    F3F(2, 0x34, 0x00a), F3F(~2, ~0x34, ~0x00a)|RS1_G0, "B,H", 0, v9 },
  1364. { "fabsq",    F3F(2, 0x34, 0x00b), F3F(~2, ~0x34, ~0x00b)|RS1_G0, "R,J", 0, v9 },
  1365. { "fabss",    F3F(2, 0x34, 0x009), F3F(~2, ~0x34, ~0x009)|RS1_G0, "f,g", 0, v6 },
  1366. { "fmovd",    F3F(2, 0x34, 0x002), F3F(~2, ~0x34, ~0x002)|RS1_G0, "B,H", 0, v9 },
  1367. { "fmovq",    F3F(2, 0x34, 0x003), F3F(~2, ~0x34, ~0x003)|RS1_G0, "R,J", 0, v9 },
  1368. { "fmovs",    F3F(2, 0x34, 0x001), F3F(~2, ~0x34, ~0x001)|RS1_G0, "f,g", 0, v6 },
  1369. { "fnegd",    F3F(2, 0x34, 0x006), F3F(~2, ~0x34, ~0x006)|RS1_G0, "B,H", 0, v9 },
  1370. { "fnegq",    F3F(2, 0x34, 0x007), F3F(~2, ~0x34, ~0x007)|RS1_G0, "R,J", 0, v9 },
  1371. { "fnegs",    F3F(2, 0x34, 0x005), F3F(~2, ~0x34, ~0x005)|RS1_G0, "f,g", 0, v6 },
  1372.  
  1373. { "faddd",    F3F(2, 0x34, 0x042), F3F(~2, ~0x34, ~0x042), "v,B,H", 0, v6 },
  1374. { "faddq",    F3F(2, 0x34, 0x043), F3F(~2, ~0x34, ~0x043), "V,R,J", 0, v8 },
  1375. { "fadds",    F3F(2, 0x34, 0x041), F3F(~2, ~0x34, ~0x041), "e,f,g", 0, v6 },
  1376. { "fsubd",    F3F(2, 0x34, 0x046), F3F(~2, ~0x34, ~0x046), "v,B,H", 0, v6 },
  1377. { "fsubq",    F3F(2, 0x34, 0x047), F3F(~2, ~0x34, ~0x047), "V,R,J", 0, v8 },
  1378. { "fsubs",    F3F(2, 0x34, 0x045), F3F(~2, ~0x34, ~0x045), "e,f,g", 0, v6 },
  1379.  
  1380. #define CMPFCC(x)    (((x)&0x3)<<25)
  1381.  
  1382. { "fcmpd",              F3F(2, 0x35, 0x052),            F3F(~2, ~0x35, ~0x052)|RD_G0,  "v,B",   0, v6 },
  1383. { "fcmpd",    CMPFCC(0)|F3F(2, 0x35, 0x052), CMPFCC(~0)|F3F(~2, ~0x35, ~0x052),     "6,v,B", 0, v9 },
  1384. { "fcmpd",    CMPFCC(1)|F3F(2, 0x35, 0x052), CMPFCC(~1)|F3F(~2, ~0x35, ~0x052),     "7,v,B", 0, v9 },
  1385. { "fcmpd",    CMPFCC(2)|F3F(2, 0x35, 0x052), CMPFCC(~2)|F3F(~2, ~0x35, ~0x052),     "8,v,B", 0, v9 },
  1386. { "fcmpd",    CMPFCC(3)|F3F(2, 0x35, 0x052), CMPFCC(~3)|F3F(~2, ~0x35, ~0x052),     "9,v,B", 0, v9 },
  1387. { "fcmped",              F3F(2, 0x35, 0x056),            F3F(~2, ~0x35, ~0x056)|RD_G0,  "v,B",   0, v6 },
  1388. { "fcmped",    CMPFCC(0)|F3F(2, 0x35, 0x056), CMPFCC(~0)|F3F(~2, ~0x35, ~0x056),     "6,v,B", 0, v9 },
  1389. { "fcmped",    CMPFCC(1)|F3F(2, 0x35, 0x056), CMPFCC(~1)|F3F(~2, ~0x35, ~0x056),     "7,v,B", 0, v9 },
  1390. { "fcmped",    CMPFCC(2)|F3F(2, 0x35, 0x056), CMPFCC(~2)|F3F(~2, ~0x35, ~0x056),     "8,v,B", 0, v9 },
  1391. { "fcmped",    CMPFCC(3)|F3F(2, 0x35, 0x056), CMPFCC(~3)|F3F(~2, ~0x35, ~0x056),     "9,v,B", 0, v9 },
  1392. { "fcmpq",              F3F(2, 0x34, 0x053),            F3F(~2, ~0x34, ~0x053)|RD_G0,     "V,R", 0, v8 },
  1393. { "fcmpq",    CMPFCC(0)|F3F(2, 0x35, 0x053), CMPFCC(~0)|F3F(~2, ~0x35, ~0x053),     "6,V,R", 0, v9 },
  1394. { "fcmpq",    CMPFCC(1)|F3F(2, 0x35, 0x053), CMPFCC(~1)|F3F(~2, ~0x35, ~0x053),     "7,V,R", 0, v9 },
  1395. { "fcmpq",    CMPFCC(2)|F3F(2, 0x35, 0x053), CMPFCC(~2)|F3F(~2, ~0x35, ~0x053),     "8,V,R", 0, v9 },
  1396. { "fcmpq",    CMPFCC(3)|F3F(2, 0x35, 0x053), CMPFCC(~3)|F3F(~2, ~0x35, ~0x053),     "9,V,R", 0, v9 },
  1397. { "fcmpeq",              F3F(2, 0x34, 0x057),            F3F(~2, ~0x34, ~0x057)|RD_G0,     "V,R", 0, v8 },
  1398. { "fcmpeq",    CMPFCC(0)|F3F(2, 0x35, 0x057), CMPFCC(~0)|F3F(~2, ~0x35, ~0x057),     "6,V,R", 0, v9 },
  1399. { "fcmpeq",    CMPFCC(1)|F3F(2, 0x35, 0x057), CMPFCC(~1)|F3F(~2, ~0x35, ~0x057),     "7,V,R", 0, v9 },
  1400. { "fcmpeq",    CMPFCC(2)|F3F(2, 0x35, 0x057), CMPFCC(~2)|F3F(~2, ~0x35, ~0x057),     "8,V,R", 0, v9 },
  1401. { "fcmpeq",    CMPFCC(3)|F3F(2, 0x35, 0x057), CMPFCC(~3)|F3F(~2, ~0x35, ~0x057),     "9,V,R", 0, v9 },
  1402. { "fcmps",              F3F(2, 0x35, 0x051),            F3F(~2, ~0x35, ~0x051)|RD_G0, "e,f",   0, v6 },
  1403. { "fcmps",    CMPFCC(0)|F3F(2, 0x35, 0x051), CMPFCC(~0)|F3F(~2, ~0x35, ~0x051),     "6,e,f", 0, v9 },
  1404. { "fcmps",    CMPFCC(1)|F3F(2, 0x35, 0x051), CMPFCC(~1)|F3F(~2, ~0x35, ~0x051),     "7,e,f", 0, v9 },
  1405. { "fcmps",    CMPFCC(2)|F3F(2, 0x35, 0x051), CMPFCC(~2)|F3F(~2, ~0x35, ~0x051),     "8,e,f", 0, v9 },
  1406. { "fcmps",    CMPFCC(3)|F3F(2, 0x35, 0x051), CMPFCC(~3)|F3F(~2, ~0x35, ~0x051),     "9,e,f", 0, v9 },
  1407. { "fcmpes",              F3F(2, 0x35, 0x055),            F3F(~2, ~0x35, ~0x055)|RD_G0, "e,f",   0, v6 },
  1408. { "fcmpes",    CMPFCC(0)|F3F(2, 0x35, 0x055), CMPFCC(~0)|F3F(~2, ~0x35, ~0x055),     "6,e,f", 0, v9 },
  1409. { "fcmpes",    CMPFCC(1)|F3F(2, 0x35, 0x055), CMPFCC(~1)|F3F(~2, ~0x35, ~0x055),     "7,e,f", 0, v9 },
  1410. { "fcmpes",    CMPFCC(2)|F3F(2, 0x35, 0x055), CMPFCC(~2)|F3F(~2, ~0x35, ~0x055),     "8,e,f", 0, v9 },
  1411. { "fcmpes",    CMPFCC(3)|F3F(2, 0x35, 0x055), CMPFCC(~3)|F3F(~2, ~0x35, ~0x055),     "9,e,f", 0, v9 },
  1412.  
  1413. /* These Extended FPop (FIFO) instructions are new in the Fujitsu
  1414.    MB86934, replacing the CPop instructions from v6 and later
  1415.    processors.  */
  1416.  
  1417. #define EFPOP1_2(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op)|RS1_G0, args, 0, sparclite }
  1418. #define EFPOP1_3(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op),        args, 0, sparclite }
  1419. #define EFPOP2_2(name, op, args) { name, F3F(2, 0x37, op), F3F(~2, ~0x37, ~op)|RD_G0,  args, 0, sparclite }
  1420.  
  1421. EFPOP1_2 ("efitod",    0x0c8, "f,H"),
  1422. EFPOP1_2 ("efitos",    0x0c4, "f,g"),
  1423. EFPOP1_2 ("efdtoi",    0x0d2, "B,g"),
  1424. EFPOP1_2 ("efstoi",    0x0d1, "f,g"),
  1425. EFPOP1_2 ("efstod",    0x0c9, "f,H"),
  1426. EFPOP1_2 ("efdtos",    0x0c6, "B,g"),
  1427. EFPOP1_2 ("efmovs",    0x001, "f,g"),
  1428. EFPOP1_2 ("efnegs",    0x005, "f,g"),
  1429. EFPOP1_2 ("efabss",    0x009, "f,g"),
  1430. EFPOP1_2 ("efsqrtd",    0x02a, "B,H"),
  1431. EFPOP1_2 ("efsqrts",    0x029, "f,g"),
  1432. EFPOP1_3 ("efaddd",    0x042, "v,B,H"),
  1433. EFPOP1_3 ("efadds",    0x041, "e,f,g"),
  1434. EFPOP1_3 ("efsubd",    0x046, "v,B,H"),
  1435. EFPOP1_3 ("efsubs",    0x045, "e,f,g"),
  1436. EFPOP1_3 ("efdivd",    0x04e, "v,B,H"),
  1437. EFPOP1_3 ("efdivs",    0x04d, "e,f,g"),
  1438. EFPOP1_3 ("efmuld",    0x04a, "v,B,H"),
  1439. EFPOP1_3 ("efmuls",    0x049, "e,f,g"),
  1440. EFPOP1_3 ("efsmuld",    0x069, "e,f,H"),
  1441. EFPOP2_2 ("efcmpd",    0x052, "v,B"),
  1442. EFPOP2_2 ("efcmped",    0x056, "v,B"),
  1443. EFPOP2_2 ("efcmps",    0x051, "e,f"),
  1444. EFPOP2_2 ("efcmpes",    0x055, "e,f"),
  1445.  
  1446. #undef EFPOP1_2
  1447. #undef EFPOP1_3
  1448. #undef EFPOP2_2
  1449.  
  1450. /* FIXME These are marked F_ALIAS, so that they won't conflict with
  1451.    new v9 or sparclite insns present.  Otherwise, the F_ALIAS flag is
  1452.    ignored.  */
  1453. { "cpop1",    F3(2, 0x36, 0), F3(~2, ~0x36, ~1), "[1+2],d", F_ALIAS, v6 },
  1454. { "cpop2",    F3(2, 0x37, 0), F3(~2, ~0x37, ~1), "[1+2],d", F_ALIAS, v6 },
  1455.  
  1456. #define IMPDEP(name, code) \
  1457. { name,    F3(2, code, 0), F3(~2, ~code, ~0)|ASI(~0), "1,2,d", 0, v9 }, \
  1458. { name,    F3(2, code, 1), F3(~2, ~code, ~1),       "1,i,d", 0, v9 }, \
  1459. { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,1,2,d", 0, v9 }, \
  1460. { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,e,f,g", 0, v9 }
  1461.  
  1462. IMPDEP ("impdep1", 0x36),
  1463. IMPDEP ("impdep2", 0x37),
  1464.  
  1465. #undef IMPDEP
  1466.  
  1467. { "casa",    F3(3, 0x3c, 0), F3(~3, ~0x3c, ~0), "[1]A,2,d", 0, v9 },
  1468. { "casa",    F3(3, 0x3c, 1), F3(~3, ~0x3c, ~1), "[1]o,2,d", 0, v9 },
  1469. { "casxa",    F3(3, 0x3e, 0), F3(~3, ~0x3e, ~0), "[1]A,2,d", 0, v9 },
  1470. { "casxa",    F3(3, 0x3e, 1), F3(~3, ~0x3e, ~1), "[1]o,2,d", 0, v9 },
  1471.  
  1472. };
  1473.  
  1474. const int bfd_sparc_num_opcodes = ((sizeof sparc_opcodes)/(sizeof sparc_opcodes[0]));
  1475.